碰到一个需求,将一个列的数据: “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
原有一列的数据:
123,124,125,126,
转化为多行的数据结果:
123
124
125
126