create table tb_cross_apply ( id int identity, multivalue varchar(64) ) insert into tb_cross_apply VALUES ('A|B|C') insert into tb_cross_apply VALUES ('E|F|G')
先运行上述代码,最后查询tb_cross_apply会得到如下结果
1 A|B|C
2 E|F|G
如果现在想要这样的结果,如何实现呢?
1 A
1 B
1 C
2 E
2 F
2 G
首先建立表值函数
CREATE FUNCTION dbo.Fn_Partition_Value (@value varchar(64)) returns @result TABLE ( subValue VARCHAR(64) ) as begin declare @sub varchar(64) declare @index int while CHARINDEX('|',@value) > 0 begin set @index = CHARINDEX('|',@value) set @sub = SUBSTRING(@value,1,@index-1) INSERT INTO @result VALUES (@sub) set @value = SUBSTRING(@value,@index + 1 , LEN(@value) - @index) end if LEN(@value) > 0 begin INSERT INTO @result VALUES (@value) end return end
然后编写下面语句
select a.id,b.subValue from tb_cross_apply a cross apply dbo.Fn_Partition_Value (a.multivalue) b
即可,本质就是将Fn_Partition_Value这个函数返回的结果与原表进行合并