当您比较不同数据类型的两列时,sql Server将尝试以较低的优先级进行隐式转换。
以下来自MSDN文档: uniqueidentifier
下面的示例演示了当值对于要转换为的数据类型而言太长时,数据将被截断。因为uniqueidentifier类型限制为36个字符,所以超过该长度的字符将被截断。
DECLARE @ID nvarchar(max) = N'0E984725-C51C-4BF4-9960-E1C80E27ABA0wrong';
SELECT @ID, CONVERT(uniqueidentifier, @ID) AS TruncatedValue;
http://msdn.microsoft.com/en- us/library/ms187942.aspx
文档很清楚,数据被
每当您不确定自己的联接操作时,都可以进行验证Actual Execution Plan
。
这是可以在SSMS或sql Sentry Plan Explorer中运行的测试示例
DECLARE @userbackup TABLE ( _FILENAME VARCHAR(70) )
INSERT INTO @userbackup
VALUES ( '15b993cc-e8be-405d-bb9f-0c58b66dcdfe' ),
( '4cffe724-3f68-4710-b785-30afde5d52f8' ),
( '4cffe724-3f68-4710-b785-30afde5d52f8_Add' )
, ( '7ad22838-ddee-4043-8d1f-6656d2953545' )
DECLARE @Requests TABLE
(
requestID UNIQUEIDENTIFIER
,_Status INT
)
INSERT INTO @Requests
VALUES ( '15b993cc-e8be-405d-bb9f-0c58b66dcdfe', 1 )
, ( '4cffe724-3f68-4710-b785-30afde5d52f8', 1 )
, ( '7ad22838-ddee-4043-8d1f-6656d2953545', 2 )
SELECT *
FROM @userbackup u
JOIN @Requests r
ON u.[_FILENAME] = r.requestID
WHERE r.[_Status] = 1
而不是常规join
操作sql Server正在做HASH MATCH
与EXPR 1006
SSMS中很难看到什么做什么,但如果你打开XML文件,你会发现这个
<ColumnReference Column="Expr1006" />
<ScalarOperator ScalarString="CONVERT_IMPLICIT(uniqueidentifier,@userbackup.[_FILENAME] as [u].[_FILENAME],0)">
如有疑问,请检查执行计划,并在比较时始终确保匹配数据类型。