アルゴリズムは、SQLServerの担当者によってここに文書化されています。SQLServer2005でGUIDはどのように比較されますか?ここで引用します(これは古い記事であり、数年で永久になくなる可能性があるため)
一般に、平等の比較は、一意の識別子の値で多くの意味があります。ただし、一般的な順序付けが必要な場合は、間違ったデータ型を調べている可能性があり、代わりにさまざまな整数型を検討する必要があります。
慎重に検討した後、uniqueidentifiercolumnで注文することにした場合、戻ってきたものに驚かれるかもしれません。
これらの2つのuniqueidentifier値が与えられた場合:
@ g1 ='55666BEE-B3A0-4BF5-81A7-86FF976E763F' @ g2 ='8DD5BCA5-6ABE-4F73-B4B7-393AE6BBB849'
'55666BEE'は確かに'8DD5BCA5'よりも小さいため、多くの人は@g1は@g2よりも小さいと考えています。ただし、これはSQLServer2005がuniqueidentifier値を比較する方法ではありません。
比較は、バイト「グループ」内の右から左、および左から右のバイト「グループ」を調べることによって行われます。バイトグループは、「-」文字で区切られたものです。より技術的には、最初にバイト{10から15}、次に{8-9}、次に{6-7}、次に{4-5}、最後に{0から3}を調べます。
この特定の例では、「86FF976E763F」と「393AE6BBB849」を比較することから始めます。すぐに、@g2が実際に@g1よりも大きいことがわかります。
.NET言語では、Guid値のデフォルトの並べ替え順序がSQLServerとは異なることに注意してください。 SQL Serverの比較セマンティクスを使用してGuidの配列またはリストを注文する必要がある場合は、代わりにSqlGuidの配列またはリストを使用できます。これにより、SQLServerのセマンティクスと一致するIComparableが実装されます。
さらに、ソートはバイトグループのエンディアンに従います(ここを参照:グローバルに一意の識別子)。グループ10〜15および8〜9はビッグエンディアン(ウィキペディアの記事のData4に対応)として保存されるため、ビッグエンディアンとして比較されます。他のグループはリトルエンディアンを使用して比較されます。