这是一种我只是错误地了解的行为。 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'
有人知道在这种情况下如何解释#和之后的任何内容吗?
答案 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