declare @ table (a varchar(100))
insert @ values('1')
insert @ values('1-1')
insert @ values('2-1-44-1-2-34')
insert @ values('2-1-45-1-1')
insert @ values('2-1')
insert @ values('3-2')
函数:
create function getNewstr(@a varchar(8000))
returns varchar(8000)
as
begin
declare @b varchar(8000)
select @b='',@a=@a+'-'
while charindex('-',@a)>0
begin
set @b=@b+right('000'+substring(@a,1,charindex('-',@a)-1),3)
set @a=right(@a,len(@a)-charindex('-',@a))
end
return @b
end
语句:
select * from table order by dbo.getNewstr(a)

解决方案 »

  1.   

    --改进版create function getorder(@field varchar(1000))
    returns varchar(8000)
    as
    begin
      declare @bb int,@cc int,@value varchar(8000)
      select @bb=0,@cc=charindex('-',@field)
      set @value=right(replicate('0',10)+substring(@field,@bb,@cc-@bb),10)
      if @value='' return left(@field+replicate('0',38),38)
      while @cc>0
      begin
        set @bb=@cc+1
        set @cc=charindex('-',@field,@bb)
        set @value=@value+right(replicate('0',10)+cast(substring(@field,@bb,case when @cc>0 then @cc-@bb else len(@field) end) as varchar),10)
      end
      return @value
    end
    go
    declare @ table (l1 varchar(1000))
    insert @ values('1')
    insert @ values('1-1')
    insert @ values('2-1-4-1')
    insert @ values('3-1-13-1-1')
    insert @ values('2-1')
    insert @ values('3-2')
    insert @ values('13-2')
    insert @ values('23-2')select *,dbo.getorder(l1) from @ order by dbo.getorder(l1)
    go
    drop function getorder