Embora esta pergunta seja específica do SQL Server e essa resposta não, achei que ainda deveria postar essas informações simplesmente para conscientizá-las e não para opor-me a qualquer outra resposta.
Dito isto, fora do SQL Server, em certos ambientes, é possível fazer esse tipo de classificação. É algo que é pelo menos especificado na documentação Unicode. No padrão / relatório UNICODE LOCALE MARKUP LANKUAGE (LDML) PARTE 5: COLLATION , há um gráfico para Configurações de agrupamento que descreve várias opções para personalizar o comportamento de classificação. Uma das opções é -kn-true
ou [numericOrdering on]
:
Se o conjunto de sobre , qualquer sequência de dígitos decimais (General_Category = Nd no [ UAX44 ]) é ordenada a um nível primário com o seu valor numérico. Por exemplo, "A-21" <"A-123". Os pesos primários calculados estão todos no início do grupo de reordenação de dígitos . Assim, com uma tabela UCA não encadernada, "a $" <"a0" <"a2" <"a12" <"a⓪" <"aa".
No entanto, este documento é um "padrão técnico" e não faz parte da especificação principal do Unicode. Uma observação na parte superior do documento afirma:
Um Padrão Técnico Unicode (UTS) é uma especificação independente. A conformidade com o Padrão Unicode não implica conformidade com nenhum UTS.
Portanto, esse comportamento específico não está disponível no SQL Server ou no .NET (pelo menos não de forma nativa), embora ambos estejam em conformidade com a especificação principal do Unicode.
O projeto ICU (International Components for Unicode) é um conjunto de bibliotecas C / C ++ e Java que implementa essa funcionalidade, e há até uma demonstração on-line. E em "projetos relacionados", há um link para um projeto .NET que parece ser um invólucro de objeto COM para a biblioteca ICU que permitiria que essa funcionalidade fosse exposta ao código gerenciado. Mas não está claro se esse projeto .NET ainda está ativo.
Mas, para ver esse comportamento em ação, vá para a Demonstração de agrupamento da UTI .
Cole o seguinte na área de texto Entrada , no lado esquerdo:
1
2
10B
6
11
10A
3
10
Defina todas as opções para "padrão". Marque a opção "inserir números de linha" à direita do sortbotão e verifique se a opção "pontos fortes da diferença" está desmarcada.
Clique no sortbotão e você deverá recuperar o seguinte:
[1] 1
[8] 10
[6] 10A
[3] 10B
[5] 11
[2] 2
[7] 3
[4] 6
É o que se deve esperar ao fazer uma classificação típica de string e o que você está vendo no SQL Server.
Agora, na série de botões de opção logo acima do sortbotão, a segunda linha é rotulada como "numérica". Selecione o botão de opção "ativado".
Clique no sortbotão novamente e você deverá recuperar o seguinte:
[1] 1
[2] 2
[7] 3
[4] 6
[8] 10
[6] 10A
[3] 10B
[5] 11
Questionando se isso funciona quando a parte numérica está no meio da string? Ok, cole o seguinte na área de texto Entrada no lado esquerdo (substituindo a 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
Verifique se a configuração numérica ainda está definida como "ativada". Clique no sortbotão novamente e você deverá recuperar o seguinte:
[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
Deseja ver isso em outro lugar? Crie uma pasta no seu disco rígido, algo como C: \ temp \ sorting \ , e crie arquivos vazios com os mesmos nomes "Script -...". Faça um DIR
em uma janela de comando e você verá a classificação padrão. Mas, ao examinar a lista de arquivos no Windows Explorer, você verá a lista classificada usando a opção "numérico" :-).