create function getorder(@field varchar(1000))
returns numeric(38)
as
begin
  declare @bb int,@cc int,@value varchar(8000)
  select @bb=0,@cc=charindex('.',@field)
  set @value=right(replicate('0',3)+substring(@field,@bb,@cc.@bb),3)
  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',3)+cast(substring(@field,@bb,case when @cc>0 then @cc.@bb else len(@field) end) as varchar),3)
  end
  return cast(left(@value+replicate('0',38),38) as  numeric(38))
enddeclare @ 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')select * from @ order by dbo.getorder(a)

解决方案 »

  1.   

    自己在sql server里创建几个函数,分别取出index的第1,2,3部分,然后根据取出的函数值排序
      

  2.   

    --转贴j老师的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
    declare @ table (a varchar(100))
    insert @ values('1')
    insert @ values('3.2')
    insert @ values('2.1.45.1.1')
    insert @ values('2.1.44.1.2.34')
    insert @ values('1.1')
    insert @ values('2.1')select *,dbo.getNewstr(a) from @ order by dbo.getNewstr(a)