Algorytm jest udokumentowany przez pracowników SQL Server tutaj:Jak są porównywane identyfikatory GUID w SQL Server 2005? Cytuję tutaj (ponieważ jest to stary artykuł, który może zniknąć na zawsze za kilka lat)
Ogólnie rzecz biorąc, porównania równości mają dużo sensu w przypadku wartości unikalnych identyfikatorów. Jeśli jednak okaże się, że potrzebujesz ogólnego uporządkowania, być może patrzysz na niewłaściwy typ danych i zamiast tego powinieneś rozważyć różne typy liczb całkowitych.
Jeśli po dokładnym zastanowieniu zdecydujesz się złożyć zamówienie na kolumnie z unikalnym identyfikatorem, możesz być zaskoczony tym, co otrzymasz z powrotem.
Biorąc pod uwagę te dwie wartości unikalnego identyfikatora:
@g1='55666BEE-B3A0-4BF5-81A7-86FF976E763F' @g2 ='8DD5BCA5-6ABE-4F73-B4B7-393AE6BBB849'
Wiele osób uważa, że @g1 jest mniejsze niż @g2, ponieważ „55666BEE” jest z pewnością mniejsze niż „8DD5BCA5”. Jednak to nie jest sposób, w jaki SQL Server2005 porównuje wartości unikalnych identyfikatorów.
Porównania dokonuje się patrząc na bajtowe „grupy” od prawej do lewej i od lewej do prawej w obrębie bajtowej „grupy”. Grupa bajtów jest oddzielona znakiem „-”. Bardziej technicznie, najpierw patrzymy na bajty {10 do 15}, potem {8-9}, potem {6-7}, potem {4-5}, a na końcu {0 do 3}.
W tym konkretnym przykładzie zaczniemy od porównania „86FF976E763F” z „393AE6BBB849”. Od razu widzimy, że @g2 jest rzeczywiście większe niż @g1.
Należy zauważyć, że w językach .NET wartości Guid mają inną domyślną kolejność sortowania niż w SQL Server. Jeśli zauważysz potrzebę uporządkowania tablicy lub listy Guid przy użyciu semantyki porównawczej SQL Server, możesz zamiast tego użyć anarray lub listy SqlGuid, która implementuje IComparable in away, co jest zgodne z semantyką SQL Server.
Dodatkowo sortowanie następuje po endianness grup bajtów (patrz tutaj:Globalnie unikalny identyfikator). Grupy 10-15 i 8-9 są przechowywane jako big endian (odpowiadając Data4 w artykule w wikipedii), więc są porównywane jako big endian. Inne grupy są porównywane za pomocą little endian.