我写了个不限级别的。楼主可以试试。另外,我假设你每级的最大数字不超过 9999,也即每级可以用4位来表示 --测试数据 DECLARE @t TABLE(c VARCHAR(20)) INSERT @t SELECT '2-1' UNION SELECT '2-2' UNION SELECT '3-3-3' UNION SELECT '5-1' UNION SELECT '20-10' UNION SELECT '3-1-1' UNION SELECT '15-3' UNION SELECT '3-2-2' UNION SELECT '3-2-10' UNION SELECT '3-3' UNION SELECT '3-3-10'--显示结果 SELECT * FROM @t ORDER BY dbo.DotIntToOrder(c) /* 2-1 2-2 3-1-1 3-2-2 3-2-10 3-3 3-3-3 3-3-10 5-1 15-3 20-10 */--自定义函数 CREATE FUNCTION DotIntToOrder (@s VARCHAR(100)) RETURNS VARCHAR(200) AS BEGIN DECLARE @tmps VARCHAR(4),@s1 VARCHAR(200) SELECT @tmps='',@s1='' WHILE CHARINDEX('-',@s)>0--LEN(REPLACE(@s,'-','--'))-LEN(@s)>=2 BEGIN SET @tmps=LEFT(@s,CHARINDEX('-',@s)-1) SELECT @s1=@s1+REPLICATE('0',4-LEN(@tmps)) + RTRIM(@tmps),@s=STUFF(@s,1,CHARINDEX('-',@s),'') END SET @s1=@s1+REPLICATE('0',4-LEN(@s)) + RTRIM(@s) RETURN @s1 END/*--------------------------------- 假如你的每级的数可能超过9999,那么将函数中的 @tmps变量的长度加长,另外,将函数中的 4-LEN(...)部分的常数4加大就可以了。比如改为5,就可以表示每级最大数为99999 ----------------------------------*/
--测试数据
DECLARE @t TABLE(c VARCHAR(20))
INSERT @t
SELECT '2-1'
UNION SELECT '2-2'
UNION SELECT '3-3-3'
UNION SELECT '5-1'
UNION SELECT '20-10'
UNION SELECT '3-1-1'
UNION SELECT '15-3'
UNION SELECT '3-2-2'
UNION SELECT '3-2-10'
UNION SELECT '3-3'
UNION SELECT '3-3-10'--显示结果
SELECT * FROM @t ORDER BY dbo.DotIntToOrder(c)
/*
2-1
2-2
3-1-1
3-2-2
3-2-10
3-3
3-3-3
3-3-10
5-1
15-3
20-10
*/--自定义函数
CREATE FUNCTION DotIntToOrder
(@s VARCHAR(100))
RETURNS VARCHAR(200)
AS
BEGIN
DECLARE @tmps VARCHAR(4),@s1 VARCHAR(200)
SELECT @tmps='',@s1=''
WHILE CHARINDEX('-',@s)>0--LEN(REPLACE(@s,'-','--'))-LEN(@s)>=2
BEGIN
SET @tmps=LEFT(@s,CHARINDEX('-',@s)-1)
SELECT @s1=@s1+REPLICATE('0',4-LEN(@tmps)) + RTRIM(@tmps),@s=STUFF(@s,1,CHARINDEX('-',@s),'')
END
SET @s1=@s1+REPLICATE('0',4-LEN(@s)) + RTRIM(@s)
RETURN @s1
END/*---------------------------------
假如你的每级的数可能超过9999,那么将函数中的 @tmps变量的长度加长,另外,将函数中的 4-LEN(...)部分的常数4加大就可以了。比如改为5,就可以表示每级最大数为99999
----------------------------------*/