写个函数
create function fn_convert(
@s varchar(300)
)
returns varchar(300)
as
begin
declare @r varchar(300)
declare @t varchar(300)
declare @f varchar(30)
declare @i int
declare @j int
set @t=@s
set @r=''
        while charindex('-',@t)>0
begin
set @r=@r+left(@t,charindex('-',@t)-1)
set @t=stuff(@t,1,charindex('-',@t),'')
set @i=cast(REVERSE(left(REVERSE(@r),PATINDEX('%[^0-9]%',REVERSE(@r))-1)) as int)+1
set @f=left(@t,PATINDEX('%[0-9]%',@t)-1)
set @t=stuff(@t,1,PATINDEX('%[0-9]%',@t)-1,'')
set @j=left(@t,PATINDEX('%[^0-9]%',@t)-1)
set @t=stuff(@t,1,PATINDEX('%[^0-9]%',@t)-1,'')
while @i<=@j
begin
set @r=@r+','+@f+cast(@i as varchar)
set @i=@i+1
end
end
if @t<>''
set @r=@r+@t
return @r
end
go--调用测试
select dbo.fn_convert('R1,R7-R14,R40-R45,R100')--结果
----------------------------------------------------------------
R1,R7,R8,R9,R10,R11,R12,R13,R14,R40,R41,R42,R43,R44,R45,R100(所影响的行数为 1 行)

解决方案 »

  1.   

    更正一个bug,适应最后一个是-的alter function fn_convert(
    @s varchar(300)
    )
    returns varchar(300)
    as
    begin
    declare @r varchar(300)
    declare @t varchar(300)
    declare @f varchar(30)
    declare @i int
    declare @j int
    set @t=@s
    set @r=''
            while charindex('-',@t)>0
    begin
    set @r=@r+left(@t,charindex('-',@t)-1)
    set @t=stuff(@t,1,charindex('-',@t),'')
    set @i=cast(REVERSE(left(REVERSE(@r),PATINDEX('%[^0-9]%',REVERSE(@r))-1)) as int)+1
    set @f=left(@t,PATINDEX('%[0-9]%',@t)-1)
    set @t=stuff(@t,1,PATINDEX('%[0-9]%',@t)-1,'')
    set @j=left(@t,PATINDEX('%[^0-9]%',@t+'a')-1)
    set @t=stuff(@t,1,PATINDEX('%[^0-9]%',@t+'a')-1,'')
    while @i<=@j
    begin
    set @r=@r+','+@f+cast(@i as varchar)
    set @i=@i+1
    end
    end
    if @t<>''
    set @r=@r+@t
    return @r
    end
    go--调用测试
    select dbo.fn_convert('R1,R7-R14,R40-R45')
    --结果
    ----------------------------------------------------------
    R1,R7,R8,R9,R10,R11,R12,R13,R14,R40,R41,R42,R43,R44,R45(所影响的行数为 1 行)