Classificação natural (alfanumérica humana) no Microsoft SQL 2005

Temos um grande banco de dados no qual temos a paginação no lado do banco de dados. Isso é rápido, retornando uma página de 50 linhas de milhões de registros em uma pequena fração de segundo.

Os usuários podem definir sua própria classificação, basicamente escolhendo por qual coluna classificar. As colunas são dinâmicas - algumas têm valores numéricos, algumas datas e algum texto.

Enquanto a maioria classifica como o texto esperado, classifica de maneira tola. Bem, digo burro, faz sentido para os computadores, mas frustra os usuários.

Por exemplo, classificar por um ID de registro de string fornece algo como:

rec1
rec10
rec14
rec2
rec20
rec3
rec4

...e assim por diante.

Quero que isso leve em consideração o número, então:

rec1
rec2
rec3
rec4
rec10
rec14
rec20

Não consigo controlar a entrada (caso contrário, eu formataria apenas os milhares) e não posso confiar em um único formato - algumas são coisas como "{alpha code} - {dept code} - {rec id}".

Conheço algumas maneiras de fazer isso em c #, mas não consigo puxar todos os registros para classificá-los, pois isso seria mais lento.

Alguém sabe uma maneira de aplicar rapidamente uma classificação natural no servidor Sql?

Estamos usando:

ROW_NUMBER() over (order by {field name} asc)

E então estamos paginando com isso.

Podemos adicionar gatilhos, embora não o fizéssemos. Toda a entrada deles é parametrizada e assim por diante, mas não posso alterar o formato - se eles colocarem "rec2" e "rec10", eles esperam que sejam retornados exatamente assim, e em ordem natural.

Temos entrada de usuário válida que segue diferentes formatos para diferentes clientes.

Pode-se rec1, rec2, rec3, ... rec100, rec101

Enquanto outro pode ocorrer: grp1rec1, grp1rec2, ... grp20rec300, grp20rec301

Quando digo que não podemos controlar a entrada, quero dizer que não podemos forçar os usuários a alterar esses padrões - eles têm um valor como grp1rec1 e não posso reformatá-lo como grp01rec001, pois isso mudaria algo usado para pesquisas e vinculação a sistemas externos.

Esses formatos variam muito, mas geralmente são misturas de letras e números.

Classificar esses itens em C # é fácil - basta dividi-los em{ "grp", 20, "rec", 301 } e, em seguida, compare os valores da sequência.

No entanto, pode haver milhões de registros e os dados são paginados, preciso que a classificação seja feita no servidor SQL.

O servidor SQL classifica por valor, não por comparação - em C # eu posso dividir os valores para comparar, mas no SQL eu preciso de uma lógica que (muito rapidamente) obtenha um único valor que classifique consistentemente.

@moebius - sua resposta pode funcionar, mas parece um compromisso feio adicionar uma chave de classificação para todos esses valores de texto.

questionAnswers(13)

yourAnswerToTheQuestion