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这个函数返回的结果与原表进行合并

posted on 2018-10-15 14:14  zooz  阅读(215)  评论(0编辑  收藏  举报