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

问题描述:

这是一个我只是偶然发现的行为。在SQL Server中的表有一个唯一标识符列,我跑起来像一个查询:Guid/UNIQUEIDENTIFIER(SQL Server)中的#是如何解释的

SELECT * FROM Tbl WHERE GuidColumn = N'2B375CD8-D210-463F-A2FD-EAFB0D643664#1' 

的#1的GUID结束误了那里,因为我曾从被追加#一个网址复制粘贴它1,#2,#3等代表寻呼。

让我吃惊的是,查询运行得很好,我得到了相同的结果,我会通过运行得到:

SELECT * FROM Tbl WHERE GuidColumn = N'2B375CD8-D210-463F-A2FD-EAFB0D643664' 

会有人知道怎么#和任何之后在这种情况下intepreted?

这一点将明确MSDN上:http://msdn.microsoft.com/en-us/library/ms187942.aspx

它不的意思是任何东西 - 当转换为Guid时,SQL服务器只读取字符串的前36个字符。

澄清

继约翰Gathogo的有关'{GUID}[gibberish]'情况下(和验收后)评论,我想我可以稍微展开规则。

1)如果字符串'{'开始,那么 MUST'}'(尝试甚至领先并在尾部的空格 - 它不会工作),否则转换失败。然后转换内部的36个字符。

2)否则,使用前36个字符。

所以你可以添加:),<<antidisestablishmentarianism - 在1)中的第38个字符或2)中的第36个字符后,它没有区别。

+1

这不是说你的解释,但这**选择*从Tbl在哪里GuidColumn = N'{2B375CD8-D210-463F-A2FD-EAFB0D643664}'**也适用。因此,当您添加{}之后,它会执行更严格的操作(超出您的FIRST 36 CHARACTERS解释),因为您不能在{}内输入其他乱码。但是,你可以在关闭后添加乱码} – 2012-03-28 15:23:05

+0

@JohnGathogo这是一个公平的点将编辑到一个更合适的东西 – 2012-03-28 15:29:35

GUID是固定宽度,因此额外字符在类型转换期间被剥离;

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

我怀疑查询引擎认为它是一个唯一标识符,内部只是截断36个字符 - 因此任何事后都会被忽略。这也能正常工作,所以它绝对无关的#标志:

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

结果:

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