вы всегда можете конвертировать ваш varchar-столбец в bigint, так как целое число может быть слишком коротким ...
select cast([yourvarchar] as BIGINT)
но вы всегда должны заботиться об альфа-символах
where ISNUMERIC([yourvarchar] +'e0') = 1
+ 'e0' происходит от http://blogs.lessthandot.com/index.php/DataMgmt/DataDesign/isnumeric-isint-isnumber
это приведет к вашему заявлению
SELECT
*
FROM
Table
ORDER BY
ISNUMERIC([yourvarchar] +'e0') DESC
, LEN([yourvarchar]) ASC
первый столбец сортировки поместит число сверху.
вторая сортировка по длине, поэтому 10 будет предшествовать 0001 (что глупо?!)
это приводит ко второй версии:
SELECT
*
FROM
Table
ORDER BY
ISNUMERIC([yourvarchar] +'e0') DESC
, RIGHT('00000000000000000000'+[yourvarchar], 20) ASC
второй столбец теперь дополняется справа '0', поэтому естественная сортировка помещает целые числа с ведущими нулями (0,01,10,0100 ...) в правильном порядке (правильно!) - но все альфы будут улучшены с '0'-символы (производительность)
третья версия:
SELECT
*
FROM
Table
ORDER BY
ISNUMERIC([yourvarchar] +'e0') DESC
, CASE WHEN ISNUMERIC([yourvarchar] +'e0') = 1
THEN RIGHT('00000000000000000000' + [yourvarchar], 20) ASC
ELSE LTRIM(RTRIM([yourvarchar]))
END ASC
теперь числа сначала дополняются символами '0' (конечно, длина 20 может быть увеличена) - что сортирует числа вправо - и альфы только обрезаются