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

时间:2012-03-28 15:03:53

标签: c# sql sql-server tsql

这是一种我只是错误地了解的行为。 SQL Server中的表有一个UNIQUEIDENTIFIER列,我运行了一个类似的查询:

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

Guid末尾的#1错误地到达了那里,因为我从附加了#1,#2,#3的网址上复制粘贴它,等等表示分页。

让我感到惊讶的是,查询运行得很好,我得到了与运行时相同的结果:

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

有人知道在这种情况下如何解释#和之后的任何内容吗?

3 个答案:

答案 0 :(得分:5)

这在MSDN上明确处理:http://msdn.microsoft.com/en-us/library/ms187942.aspx

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

<强> 澄清

在John Gathogo关于'{GUID}[gibberish]'案件(以及接受后)的评论之后,我想我可以稍微扩展规则。

1)如果该字符串以'{'开头,那么 38th 必须'}'(尝试在其中的前导和尾随空格 - 不起作用),否则转换失败。然后转换36个字符。

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

因此,您可以在1)中的第38个字符或2中的第36个字符之后添加:)<<antidisestablishmentarianism,这没有任何区别。

答案 1 :(得分:2)

GUID是固定宽度,因此在类型转换期间会删除额外字符;

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

答案 2 :(得分:2)

我怀疑查询引擎发现它是一个uniqueidentifier,内部只是截断36个字符 - 所以之后的任何事情都会被忽略。这也很好,所以它与#符号完全无关:

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

结果:

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