更正一个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 行)
本文介绍了一个用于修正字符串中范围表达式的SQL函数。该函数能够将类似'R7-R14'这样的范围转换为独立的元素列表'R7,R8,...,R14'。通过递归处理输入字符串中的每个范围,函数实现了复杂范围表达式的正确解析。

被折叠的 条评论
为什么被折叠?



