2012-03-28 56 views
4

這是一個我只是偶然發現的行爲。在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?

回答

5

這一點將明確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

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