Às vezes, você simplesmente não tem a opção de armazenar números misturados com texto. Em um de nossos aplicativos, o host do site que usamos para nosso site de comércio eletrônico cria filtros dinamicamente fora das listas. Não há opção de classificar por qualquer campo, exceto pelo texto exibido. Quando queríamos filtros construídos a partir de uma lista que dizia coisas como 2 "a 8" 9 "a 12" 13 "a 15" etc., precisávamos classificar 2-9-13, não 13-2-9 como acontecerá quando lendo os valores numéricos. Portanto, usei a função Replicar do SQL Server junto com o comprimento do número mais longo para preencher quaisquer números mais curtos com um espaço à esquerda. Agora, 20 é classificado após 3 e assim por diante.
Eu estava trabalhando com uma visão que me dava os comprimentos, larguras, etc. mínimos e máximos para o tipo de item e classe, e aqui está um exemplo de como fiz o texto. (LB n Low e LB n High são as extremidades inferior e superior dos 5 suportes de comprimento.)
REPLICATE(' ', LEN(LB5Low) - LEN(LB1High)) + CONVERT(NVARCHAR(4), LB1High) + '" and Under' AS L1Text,
REPLICATE(' ', LEN(LB5Low) - LEN(LB2Low)) + CONVERT(NVARCHAR(4), LB2Low) + '" to ' + CONVERT(NVARCHAR(4), LB2High) + '"' AS L2Text,
REPLICATE(' ', LEN(LB5Low) - LEN(LB3Low)) + CONVERT(NVARCHAR(4), LB3Low) + '" to ' + CONVERT(NVARCHAR(4), LB3High) + '"' AS L3Text,
REPLICATE(' ', LEN(LB5Low) - LEN(LB4Low)) + CONVERT(NVARCHAR(4), LB4Low) + '" to ' + CONVERT(NVARCHAR(4), LB4High) + '"' AS L4Text,
CONVERT(NVARCHAR(4), LB5Low) + '" and Over' AS L5Text