sql >> Base de Datos >  >> RDS >> Sqlserver

Algoritmo de clasificación GUID de SQL Server. ¿Por qué?

El algoritmo está documentado por los chicos de SQL Server aquí:¿Cómo se comparan los GUID en SQL Server 2005? Cito aquí aquí (ya que es un artículo antiguo que puede desaparecer para siempre en unos años)

En general, las comparaciones de igualdad tienen mucho sentido con valores de identificadores únicos. Sin embargo, si necesita un orden general, es posible que esté viendo el tipo de datos incorrecto y debería considerar varios tipos de enteros en su lugar.

Si, después de pensarlo detenidamente, decide hacer un pedido en una columna de identificador único, es posible que se sorprenda con lo que obtendrá.

Dados estos dos valores de identificador único:

@g1='55666BEE-B3A0-4BF5-81A7-86FF976E763F' @g2 ='8DD5BCA5-6ABE-4F73-B4B7-393AE6BBB849'

Mucha gente piensa que @g1 es menor que @g2, ya que '55666BEE' es ciertamente menor que '8DD5BCA5'. Sin embargo, no es así como SQL Server 2005 compara valores de identificadores únicos.

La comparación se realiza observando los "grupos" de bytes de derecha a izquierda y de izquierda a derecha dentro de un "grupo" de bytes. Un grupo de bytes es lo que está delimitado por el carácter '-'. Más técnicamente, observamos primero los bytes {10 a 15}, luego {8-9}, luego {6-7}, luego {4-5} y, por último, {0 a 3}.

En este ejemplo específico, comenzaríamos comparando '86FF976E763F' con '393AE6BBB849'. Inmediatamente vemos que @g2 es mayor que @g1.

Tenga en cuenta que en los lenguajes .NET, los valores Guid tienen un orden de clasificación predeterminado diferente al de SQL Server. Si encuentra la necesidad de ordenar una matriz o una lista de Guid usando la semántica de comparación de SQL Server, puede usar una matriz o una lista de SqlGuid en su lugar, que implementa IComparable de manera consistente con la semántica de SQL Server.

Además, la ordenación sigue el endianness de los grupos de bytes (ver aquí:Identificador único global). Los grupos 10-15 y 8-9 se almacenan como big endian (correspondientes a Data4 en el artículo de wikipedia), por lo que se comparan como big endian. Otros grupos se comparan usando little endian.