Si bien esta pregunta es específica de SQL Server, y esta respuesta no lo es, sentí que aún debería publicar esta información simplemente para dar a conocer y no oponerme a ninguna de las otras respuestas.
Dicho esto, fuera de SQL Server, en ciertos entornos es posible hacer este tipo de clasificación. Es algo que al menos se especifica en la documentación de Unicode. En el LENGUAJE DE MARCADO DE DATOS LOCALES UNICODE (LDML) PARTE 5: estándar / informe COLLATION , hay un gráfico para la Configuración de clasificación que describe varias opciones para adaptar el comportamiento de clasificación. Una de las opciones es -kn-true
o [numericOrdering on]
:
Si se establece en en , cualquier secuencia de dígitos decimales (General_Category = Nd en el [ UAX44 ]) se ordena a un nivel primario con su valor numérico. Por ejemplo, "A-21" <"A-123". Los pesos primarios calculados están todos al comienzo del grupo de reordenación de dígitos . Así, con una tabla UCA no adaptada, "a $" <"a0" <"a2" <"a12" <"a⓪" <"aa".
Sin embargo, este documento es un "estándar técnico" y no forma parte de la especificación central de Unicode. Una nota en la parte superior del documento dice:
Un estándar técnico Unicode (UTS) es una especificación independiente. La conformidad con el estándar Unicode no implica la conformidad con ningún UTS.
Por lo tanto, este comportamiento particular no está disponible en SQL Server o incluso en .NET (al menos no de forma nativa), aunque ambos se ajustan a la especificación central de Unicode.
El proyecto ICU (International Components for Unicode) es un conjunto de bibliotecas C / C ++ y Java que implementa esta funcionalidad, e incluso hay una demostración en línea de la misma. Y bajo "proyectos relacionados" hay un enlace a un proyecto .NET que parece ser un contenedor de objetos COM para la biblioteca ICU que permitiría que esta funcionalidad se exponga al código administrado. Pero no está claro si ese proyecto .NET aún está activo.
Pero para ver este comportamiento en acción, vaya a la demostración de colación de UCI .
Pegue lo siguiente en el área de texto de entrada en el lado izquierdo:
1
2
10B
6
11
10A
3
10
Establezca todas las opciones en "predeterminado". Marque la opción "ingresar números de línea" a la derecha del sortbotón y asegúrese de que la opción "intensidades de diferencia" no esté marcada.
Haga clic en el sortbotón y debería recuperar lo siguiente:
[1] 1
[8] 10
[6] 10A
[3] 10B
[5] 11
[2] 2
[7] 3
[4] 6
Esto es lo que se debe esperar al hacer una ordenación de cadena típica y lo que está viendo en SQL Server.
Ahora, en la serie de botones de radio justo encima del sortbotón, la segunda fila está etiquetada como "numérica". Seleccione el botón de opción "encendido".
Vuelva a hacer clic en el sortbotón y debería recuperar lo siguiente:
[1] 1
[2] 2
[7] 3
[4] 6
[8] 10
[6] 10A
[3] 10B
[5] 11
¿Se pregunta si esto funciona cuando la porción numérica está en el medio de la cadena? Ok, pegue lo siguiente en el área de texto de entrada en el lado izquierdo (reemplazando la lista anterior):
Script - 1.sql
Script - 2.sql
Script - 10B.sql
Script - 6.sql
Script - 11.sql
Script - 10A.sql
Script - 3.sql
Script - 10.sql
Asegúrese de que la configuración numérica todavía esté establecida en "on". Vuelva a hacer clic en el sortbotón y debería recuperar lo siguiente:
[1] Script - 1.sql
[2] Script - 2.sql
[7] Script - 3.sql
[4] Script - 6.sql
[8] Script - 10.sql
[6] Script - 10A.sql
[3] Script - 10B.sql
[5] Script - 11.sql
¿Quieres ver esto en otro lugar? Cree una carpeta en su disco duro, algo así como C: \ temp \ sorting \ , y cree archivos vacíos con los mismos nombres "Script -...". Haga una DIR
en una ventana de comandos y verá la clasificación estándar. Pero al mirar la lista de archivos en el Explorador de Windows, verá la lista ordenada con la opción "numérica" :-).