写个函数
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 行)
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 行)
@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 行)