为什么SQL Server会给我错误的输出?

时间:2015-04-02 11:20:13

标签: sql sql-server ssms

我注意到SSMS中存在类似bug的行为。我使用以下查询从名为Candidate的表中查询。

 select CandidateId, CandidateName from Candidate
 where CandidateId='73415005-77C6-4D4B-9947-02D6B148E03F2'

我正在复制粘贴CandidateId,这是一个唯一的标识符,但不知何故,我最后添加了两个(2)。实际上,我查询的候选人ID是“73415005-77C6-4D4B-9947-02D6B148E03F”,并且没有候选人73415005-77C6-4D4B-9947-02D6B148E03F2的候选人(我甚至认为这不是GUID)

但是,我还是得到了结果。

enter image description here

您可以在查询和结果中看到,CandidateId是不同的。为什么会这样?任何人请解释。

4 个答案:

答案 0 :(得分:5)

因为您的CandidateId列是GUID类型,所以条件的右(字符串)部分会转换为uniqueidentifier数据类型并被截断。您可以在执行计划中看到这一点。索引搜索/扫描操作符中将有一个标量运算符(CONVERT_IMPLICIT(uniqueidentifier,[@ 1],0))。

答案 1 :(得分:5)

那是因为你的执行计划中可能有一个convert_implicit,并且已经转换了SQL转换后的#7; 73415005-77C6-4D4B-9947-02D6B148E03F2'进入guid。

enter image description here

答案 2 :(得分:5)

顶级描述是字符串被转换为唯一标识符,因此忽略最后一位。

记录了这个逻辑。首先,唯一标识符的运算符优先级略高于字符串。 documentation的相关部分:

  
      
  1. 唯一标识符
  2.   
  3. nvarchar(包括nvarchar(max))
  4.   
  5. 的nchar
  6.   
  7. varchar(包括varchar(max))
  8.   
  9.   

这就是转换为uniqueidentifier而不是字符串的原因。

其次,这是SQL Server执行"静默转换"的情况。也就是说,它会转换前36个字符,并且不会为较长的字符串生成错误。这也是documented

  

以下示例演示了截断数据时的情况   转换为的数据类型的值太长。因为   uniqueidentifier类型限制为36个字符,即字符   超过那个长度被截断。

因此,您看到的行为不是错误。它是记录在案的行为,结合了记录的SQL Server功能的两个不同方面。

答案 3 :(得分:1)

SQL为转换为的数据类型的值太长时截断数据。 由于您尝试将uniqueidentifier字段与文本变量进行比较,因此SQL将其转换为uniqueidentifier。这不是一个错误。

例:     选择Cast('73415005-77C6-4D4B-9947-02D6B148E03F2'作为uniqueidentifier)

结果:

73415005-77C6-4D4B-9947-02D6B148E03F