碰到一个需求,将一个列的数据: “122,123,145” 或者“122,123,145,”,变成多行,表值函数如下:
Create FUNCTION transColS
(
@id varchar(4000)
)
RETURNS @st TABLE (id int)
begin
declare @str as varchar(4000)
IF(substring(@id,len(@id),1))<>','
SET @id=@id+','
set @str=@id
declare @strV as varchar(4000)
declare @num int
set @num=(len(@str)-len(replace(@str, ',', '')))/len(',') --计算@str中有多少个“,”,用于循环
while(@num>0)
begin
set @strV=substring(@str,0,charindex(',',@str))
set @str=substring(@str,LEN(@strV)+2,LEN(@str))
set @num=@num-1
insert into @st(id) values(@strV)
end
return
end
查询数据,即可看到数据
select ab.id,t.id from ab cross apply dbo.transColS(ab.id) t
结果是:
原有一列的数据:
123,124,125,126,
转化为多行的数据结果:
123
124
125
126