您没有指定要作为输出的数据类型。我假设您希望按照 1.XXX 格式指定的字符串排序
有几种方法可以解决这个问题。一个紧凑的版本是将数字 0 到 100 交叉连接几次:
;with Numbers (n) as
(
select 0 -- base case: 0
union all
select n + 1 from Numbers where n < 100 -- recursive case: numbers 1 to 100
)
select
cast (LV1.n as varchar) +
case LV2.n when 0 then '' else '.' + cast (LV2.n as varchar) end +
case LV3.n when 0 then '' else '.' + cast (LV3.n as varchar) end +
case LV4.n when 0 then '' else '.' + cast (LV4.n as varchar) end
from Numbers LV1
cross join Numbers LV2
cross join Numbers LV3
cross join Numbers LV4
where
LV1.n = 1
and
(
(LV2.n = 0 and LV3.n = 0 and LV4.n = 0) -- 1.0.0.0 is OK
or (LV2.n <> 0 and LV3.n = 0 and LV4.n = 0) -- 1.X.0.0 is OK
or (LV2.n <> 0 and LV3.n <> 0 and LV4.n = 0) -- 1.X.X.0 is OK
or (LV2.n <> 0 and LV3.n <> 0 and LV4.n <> 0) -- 1.X.X.X is OK
)
order by LV1.n, LV2.n, LV3.n, LV4.n
此示例使用递归公用表表达式 (CTE) 生成数字 0 到 100。然后代码将这些数字交叉连接在一起 4 次以形成 XXXX 模式
where 子句将输出限制为第一个数字为 1 并且在零值之后没有非零值的所有情况。
选择将零值转换为空白。所以 1.0.0.0 被翻译成“1”,1.1.0.0 被转换成“1.1”,等等。
当在我的开发机器上针对 SQL Server 2008 R2 Developer Edition SSMS 查询窗口运行时,这将在 3 秒内开始返回数据。它在大约 15 秒内完成返回 100 万条记录。