我注意到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)
但是,我还是得到了结果。
您可以在查询和结果中看到,CandidateId是不同的。为什么会这样?任何人请解释。
答案 0 :(得分:5)
因为您的CandidateId列是GUID类型,所以条件的右(字符串)部分会转换为uniqueidentifier数据类型并被截断。您可以在执行计划中看到这一点。索引搜索/扫描操作符中将有一个标量运算符(CONVERT_IMPLICIT(uniqueidentifier,[@ 1],0))。
答案 1 :(得分:5)
那是因为你的执行计划中可能有一个convert_implicit,并且已经转换了SQL转换后的#7; 73415005-77C6-4D4B-9947-02D6B148E03F2'进入guid。
答案 2 :(得分:5)
顶级描述是字符串被转换为唯一标识符,因此忽略最后一位。
记录了这个逻辑。首先,唯一标识符的运算符优先级略高于字符串。 documentation的相关部分:
- 唯一标识符
- nvarchar(包括nvarchar(max))
- 的nchar
- varchar(包括varchar(max))
- 炭
醇>
这就是转换为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