2012-03-28 8 views
4

私は誤って習得したような動作です。 SQL Server内のテーブルには、UNIQUEIDENTIFIER列を持っており、私のようなクエリ走った:私は#を付加したURLからそれをコピー、貼り付けていたとしてのGuidの終わりにGuid/UNIQUEIDENTIFIER(SQL Server)に#intepretedはどのようになっていますか

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

#1を誤ってそこに着きました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

それはありませんmean何か - SQL Serverは、Guidに変換するときに、文字列の最初の36文字だけを読み取ります。 '{GUID}[gibberish]'ケース(及び受理後)について、ジョンGathogoさんのコメントに続いて

明確化は、私は少しルールを拡張することができると思います。それは動作しません)、それ以外の場合は、変換が失敗した - その文字列が'{'で始まる場合

1)、その後、第38回MUSTは'}'が(でも有数と内末尾のスペースを試すこと。その後、36文字が変換されます。

2)それ以外の場合は、最初の36文字が使用されます。

:),<<およびantidisestablishmentarianismを追加できます。1)の38番目の文字または2番目の36番目の文字の後には、違いはありません。

+1

あなたの説明には異論はありませんが、** SELECT * FROM Tbl WHERE GuidColumn = N '{2B375CD8-D210-463F-A2FD-EAFB0D643664}' **も機能します。だから、あなたが{}内に他の言い訳を入力することができなくなってから{}を追加すると、より厳しい(あなたの最初の36文字の説明を超えて)何かが行われます。しかし、あなたは終わりの後で不器用を追加することができます –

+0

@ JohnGathogoは、公正な点はもう少し適切な何かに編集されます –

2

GUIDは固定幅であるため、型変換中に余分な文字が削除されます。

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

私は、クエリエンジンは、それがUNIQUEIDENTIFIERで、内部だけで36文字で切り捨てられていること見ている疑いがある - ので、何が後で単に無視されるだろう。それは#記号とは全く関係ありませんので、これはまた、正常に動作します:

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

結果:

------------------------------------ 
F9B8E808-E589-499B-8E57-22B7CBB2D63E 
関連する問題