2012-03-28 10 views
4

Hier ist ein Verhalten, das ich nur aus Versehen erfahren habe. Eine Tabelle in SQL Server verfügt über eine UNIQUE Spalte und ich lief eine Abfrage wie:Wie wird ein # in einem Guid/UNIQUEIDENTIFIER (SQL Server) interpretiert

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

Die # 1 am Ende des Guid bekam versehentlich dort, wie ich es von einem URL Kopie kleistert hatte, die # wurde Anfügen 1, # 2, # 3 usw., die Paging darstellen.

Was mich überrascht ist, dass die Abfrage nur gut lief und ich habe das gleiche Ergebnis wie ich durch Laufen bekommen würde:

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

Würde jemand wissen, wie die # und etwas nach in einem solchen Szenario interpretiert wird ist?

Antwort

5

Diese mit explizit auf MSDN behandelt werden: http://msdn.microsoft.com/en-us/library/ms187942.aspx

Es ist nicht bedeutet alles - SQL Server liest nur die ersten 36 Zeichen der Zeichenfolge bei der Konvertierung in Guid.

Klärung

Nach John Gathogo Kommentar über den '{GUID}[gibberish]' Fall (und nach der Annahme), ich glaube, ich leicht die Regel erweitern.

1) Wenn die Zeichenfolge mit '{' beginnt, dann ist die 38.MUST sein '}' (sogar versuchen, führende und nachfolgende Leerzeichen innerhalb - es wird nicht funktionieren), sonst Konvertierung fehlschlägt. Dann werden die 36 Zeichen innerhalb konvertiert.

2) Ansonsten werden die ersten 36 Zeichen verwendet.

So können Sie :), << und antidisestablishmentarianism hinzufügen - nach der 38. Charakter in 1) oder der 36. in 2), macht es keinen Unterschied.

+1

Nicht, dass Ihre Erklärung bestreiten, aber das ** SELECT * FROM Tbl WHERE GuidColumn = N '{2B375CD8-D210-463F-A2FD-EAFB0D643664} ** funktioniert auch. Es macht also etwas strenger (über die Erklärung von FIRST 36 CHARACTERS hinaus), wenn du {} hinzufügst, da du dann kein anderes Kauderwelsch innerhalb von {} eingeben kannst. Sie können jedoch Kauderwelsch nach dem Schließen} –

+0

@JohnGathogo hinzufügen, dass ein fairer Punkt zu etwas passender etwas bearbeiten wird –

2

Eine GUID ist eine feste Breite, daher wird das zusätzliche Zeichen während der Typkonvertierung entfernt.

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

Ich vermute, dass die Abfrage-Engine sieht, dass es ein uniqueidentifier ist und intern nur 36 Zeichen abschneidet - also würde alles danach einfach ignoriert werden. Dies funktioniert auch gut, so hat es absolut nichts mit dem # Zeichen zu tun:

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

Ergebnisse:

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