Vergleichen von GUID- und 'uniqueidentifier'-Werten (ADO.NET)
Aktualisiert: November 2007
Der GUID-Datentyp (Globally Unique Identifier, global eindeutiger Bezeichner) in SQL Server wird durch den uniqueidentifier-Datentyp dargestellt, der einen 16-Byte-Binärwert speichert.Ein GUID ist eine Binärzahl, und wird hauptsächlich als Bezeichner verwendet, der in einem Netzwerk mit vielen Computern an vielen Standorten eindeutig sein muss. GUIDs können durch den Aufruf der Transact-SQL-Funktion NEWID erstellt werden und sind garantiert weltweit eindeutig. Weitere Informationen finden Sie in der Onlinedokumentation zu SQL Server unter "Using uniqueidentifier Data".
Arbeiten mit SqlGuid-Werten
Da GUID-Werte lang und verwirrend sind, haben sie für Benutzer keine Bedeutung. Wenn zufällig generierte GUIDs für Schlüsselwerte verwendet werden und Sie viele Zeilen einfügen, erfolgt eine zufällige Eingabe/Ausgabe in den Indizes. Dies führt zu einer Beeinträchtigung der Leistung. GUIDs sind im Vergleich zu anderen Datentypen auch vergleichsweise groß. Daher ist die Verwendung von GUIDs im Allgemeinen nur für sehr begrenzte Szenarios empfehlenswert, für die kein anderer Datentyp passend ist.
Vergleichen von GUID-Werten
uniqueidentifier-Werte können zusammen mit Vergleichsoperatoren verwendet werden.Eine Sortierung wird allerdings nicht durch Vergleich der Bitmuster der beiden Werte implementiert. Die einzigen für einen uniqueidentifier-Wert zulässigen Operationen sind das Vergleichen (=, <>, <, >, <=, >=) und das Überprüfen auf NULL (IS NULL und IS NOT NULL).Andere arithmetische Operationen sind nicht zulässig.
Sowohl Guid als auch SqlGuid verfügen über eine CompareTo-Methode zum Vergleichen unterschiedlicher GUID-Werte. Allerdings werden System.Guid.CompareTo und SqlTypes.SqlGuid.CompareTo verschieden implementiert. SqlGuid implementiert CompareTo unter Verwendung des SQL Server-Verhaltens. Dabei werden nur die letzten 6 Bytes eines Werts ausgewertet. Guid wertet alle 16 Bytes aus.Im folgenden Beispiel wird dieses unterschiedliche Verhalten veranschaulicht. Der erste Codeabschnitt zeigt unsortierte Guid-Werte an, und der zweite Codeabschnitt zeigt die sortierten Guid-Werte. Der dritte Abschnitt zeigt die sortierten SqlGuid-Werte. Die Ausgabe wird unter der Codeauflistung gezeigt.
Private Sub WorkWithGuids()
' Create an ArrayList and fill it with Guid values.
Dim guidList As New ArrayList()
guidList.Add(New Guid("3AAAAAAA-BBBB-CCCC-DDDD-2EEEEEEEEEEE"))
guidList.Add(New Guid("2AAAAAAA-BBBB-CCCC-DDDD-1EEEEEEEEEEE"))
guidList.Add(New Guid("1AAAAAAA-BBBB-CCCC-DDDD-3EEEEEEEEEEE"))
' Display the unsorted Guid values.
Console.WriteLine("Unsorted Guids:")
For Each guidValue As Guid In guidList
Console.WriteLine("{0}", guidValue)
Next
Console.WriteLine()
' Sort the Guids.
guidList.Sort()
' Display the sorted Guid values.
Console.WriteLine("Sorted Guids:")
For Each guidSorted As Guid In guidList
Console.WriteLine("{0}", guidSorted)
Next
Console.WriteLine()
' Create an ArrayList of SqlGuids.
Dim sqlGuidList As New ArrayList()
sqlGuidList.Add(New SqlGuid("3AAAAAAA-BBBB-CCCC-DDDD-2EEEEEEEEEEE"))
sqlGuidList.Add(New SqlGuid("2AAAAAAA-BBBB-CCCC-DDDD-1EEEEEEEEEEE"))
sqlGuidList.Add(New SqlGuid("1AAAAAAA-BBBB-CCCC-DDDD-3EEEEEEEEEEE"))
' Sort the SqlGuids. The unsorted SqlGuids are in the same order
' as the unsorted Guid values.
sqlGuidList.Sort()
' Display the sorted SqlGuids. The sorted SqlGuid values are
' ordered differently than the Guid values.
Console.WriteLine("Sorted SqlGuids:")
For Each sqlGuidValue As SqlGuid In sqlGuidList
Console.WriteLine("{0}", sqlGuidValue)
Next
End Sub
private static void WorkWithGuids()
{
// Create an ArrayList and fill it with Guid values.
ArrayList guidList = new ArrayList();
guidList.Add(new Guid("3AAAAAAA-BBBB-CCCC-DDDD-2EEEEEEEEEEE"));
guidList.Add(new Guid("2AAAAAAA-BBBB-CCCC-DDDD-1EEEEEEEEEEE"));
guidList.Add(new Guid("1AAAAAAA-BBBB-CCCC-DDDD-3EEEEEEEEEEE"));
// Display the unsorted Guid values.
Console.WriteLine("Unsorted Guids:");
foreach (Guid guidValue in guidList)
{
Console.WriteLine(" {0}", guidValue);
}
Console.WriteLine("");
// Sort the Guids.
guidList.Sort();
// Display the sorted Guid values.
Console.WriteLine("Sorted Guids:");
foreach (Guid guidSorted in guidList)
{
Console.WriteLine(" {0}", guidSorted);
}
Console.WriteLine("");
// Create an ArrayList of SqlGuids.
ArrayList sqlGuidList = new ArrayList();
sqlGuidList.Add(new SqlGuid("3AAAAAAA-BBBB-CCCC-DDDD-2EEEEEEEEEEE"));
sqlGuidList.Add(new SqlGuid("2AAAAAAA-BBBB-CCCC-DDDD-1EEEEEEEEEEE"));
sqlGuidList.Add(new SqlGuid("1AAAAAAA-BBBB-CCCC-DDDD-3EEEEEEEEEEE"));
// Sort the SqlGuids. The unsorted SqlGuids are in the same order
// as the unsorted Guid values.
sqlGuidList.Sort();
// Display the sorted SqlGuids. The sorted SqlGuid values are ordered
// differently than the Guid values.
Console.WriteLine("Sorted SqlGuids:");
foreach (SqlGuid sqlGuidValue in sqlGuidList)
{
Console.WriteLine(" {0}", sqlGuidValue);
}
}
Dieses Beispiel liefert die folgenden Ergebnisse.
Unsorted Guids:
3aaaaaaa-bbbb-cccc-dddd-2eeeeeeeeeee
2aaaaaaa-bbbb-cccc-dddd-1eeeeeeeeeee
1aaaaaaa-bbbb-cccc-dddd-3eeeeeeeeeee
Sorted Guids:
1aaaaaaa-bbbb-cccc-dddd-3eeeeeeeeeee
2aaaaaaa-bbbb-cccc-dddd-1eeeeeeeeeee
3aaaaaaa-bbbb-cccc-dddd-2eeeeeeeeeee
Sorted SqlGuids:
2aaaaaaa-bbbb-cccc-dddd-1eeeeeeeeeee
3aaaaaaa-bbbb-cccc-dddd-2eeeeeeeeeee
1aaaaaaa-bbbb-cccc-dddd-3eeeeeeeeeee