Algoritmen är dokumenterad av SQL Server-killarna här:Hur jämförs GUIDs i SQL Server 2005? Jag citerar här (eftersom det är en gammal artikel som kan vara borta för alltid om några år)
I allmänhet är jämställdhetsjämförelser mycket meningsfulla med unika identifierarvärden. Men om du upptäcker att du behöver allmän ordning, kanske du tittar på fel datatyp och bör överväga olika heltalstyper istället.
Om du efter noggrant övervägande bestämmer dig för att beställa på en unik identifieringskolumn, kan du bli förvånad över vad du får tillbaka.
Givet dessa två unika identifierarvärden:
@g1='55666BEE-B3A0-4BF5-81A7-86FF976E763F' @g2 ='8DD5BCA5-6ABE-4F73-B4B7-393AE6BBB849'
Många tror att @g1 är mindre än @g2, eftersom '55666BEE' definitivt är mindre än '8DD5BCA5'. Det är dock inte så SQL Server2005 jämför unika identifierarvärden.
Jämförelsen görs genom att titta på byte "grupper" höger till vänster och vänster till höger inom en byte "grupp". En bytegrupp är vad som avgränsas av tecknet '-'. Mer tekniskt ser vi först på byte {10 till 15}, sedan {8-9}, sedan {6-7}, sedan {4-5} och till sist {0 till 3}.
I det här specifika exemplet skulle vi börja med att jämföra '86FF976E763F' med '393AE6BBB849'. Omedelbart ser vi att @g2 verkligen är större än @g1.
Observera att i .NET-språk har Guid-värden en annan standardsortering än i SQL Server. Om du upptäcker behovet av att beställa en array eller lista med Guid med hjälp av SQL Server-jämförelsesemantik, kan du använda anarray eller list av SqlGuid istället, som implementerar IComparable på en gång, vilket överensstämmer med SQL Server-semantik.
Dessutom följer sorteringen bytegruppers endianness (se här:Globalt unik identifierare). Grupperna 10-15 och 8-9 lagras som big endian (motsvarande Data4 i wikipedia-artikeln), så de jämförs som big endian. Andra grupper jämförs med little endian.