在Guid/UNIQUEIDENTIFIER(SQL Server)中,#是如何解释的?

4
这里是我无意中学到的一种行为。在SQL Server中,有一个UNIQUEIDENTIFIER列的表,我运行了如下查询:
SELECT * FROM Tbl WHERE GuidColumn = N'2B375CD8-D210-463F-A2FD-EAFB0D643664#1'

在Guid末尾的#1是由于我复制粘贴了一个带有#1、#2、#3等表示分页的url而误传过来的。
令我惊讶的是,查询运行得很好,结果与运行以下查询所得到的结果相同:
SELECT * FROM Tbl WHERE GuidColumn = N'2B375CD8-D210-463F-A2FD-EAFB0D643664'

"在这种情况下,有人知道 # 号及其后面的任何内容是如何解释的吗?"
3个回答

5
这在MSDN上有明确的解释:http://msdn.microsoft.com/en-us/library/ms187942.aspx。它并没有任何意义 - 当转换为Guid时,SQL server只读取字符串的前36个字符。请注意以下细则:
1)如果该字符串以“{”开头,则第38个字符必须是“}”(甚至可以内部包含前导和尾随空格-也不起作用),否则转换失败。然后将转换其中的36个字符。
2)否则,使用前36个字符。
所以你可以在1)的第38个字符或2)的第36个字符之后添加“:)”,“<<”和“antidisestablishmentarianism”,都没有影响。

1
不是我质疑你的解释,但这个 SELECT * FROM Tbl WHERE GuidColumn = N'{2B375CD8-D210-463F-A2FD-EAFB0D643664}' 也可以工作。因此,当你添加 {} 时,它会执行比你所解释的前36个字符更严格的操作,因为在 {} 中你不能输入其他无意义的内容。然而,在闭合 } 后面你可以添加无意义的内容。 - John Gathogo
@JohnGathogo,你说得很有道理,我会修改成更合适的内容。 - Andras Zoltan

2

GUID是定长的,所以在类型转换过程中会去掉多余的字符;

declare @g uniqueidentifier = '2B375CD8-D210-463F-A2FD-EAFB0D643664#1'
select @g
>> 2B375CD8-D210-463F-A2FD-EAFB0D643664

2

我怀疑查询引擎会将其视为唯一标识符,内部只截取36个字符,因此之后的任何内容都会被忽略。这也可以正常工作,所以它与#符号完全无关:

SELECT CONVERT(UNIQUEIDENTIFIER, 'F9B8E808-E589-499B-8E57-22B7CBB2D63E ...
       and here is some extra garbage for fun');

结果:

------------------------------------
F9B8E808-E589-499B-8E57-22B7CBB2D63E

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接