当您比较不同数据类型的两列时,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与
EXPR1006SSMS中很难看到什么做什么,但如果你打开XML文件,你会发现这个
<ColumnReference Column="Expr1006" /><ScalarOperator ScalarString="CONVERT_IMPLICIT(uniqueidentifier,@userbackup.[_FILENAME] as [u].[_FILENAME],0)">
如有疑问,请检查执行计划,并在比较时始终确保匹配数据类型。



