用于将单元格值拆分为行的SQL

时间:2017-02-22 10:31:47

标签: sql-server sql-server-2008

我有以下记录

"NO" "EXECQTY" "PRNO"
"WDNSLR/1" "10" "~PRSLR/00001~,~PRSLR/00002~,~PRSLR/00003~,~PRSLR/00004~"

并想要像这样显示

"NO" "EXECQTY" "PRNO

"WDNSLR/1" "10" "PRSLR/00001"

"WDNSLR/1" "10" "PRSLR/00002

"WDNSLR/1" "10" "PRSLR/00003

"WDNSLR/1" "10" "PRSLR/00004

注意
 双引号用于显示区分列值

1 个答案:

答案 0 :(得分:0)

好的,所以你真正需要的是将PRNO列的内容分成行并将其连接回原始表。

这就是表格:

declare @t table (NO varchar(20), EXECQTY varchar(20), PRNO varchar(100))
insert @t values ('WDNSLR/1', '10', '~PRSLR/00001~,~PRSLR/00002~,~PRSLR/00003~,~PRSLR/00004~')

这就是代码:

select t.no, t.execqty, replace(f.item, '~', '') as prno
from @t t
cross apply (
    select 
        item = ltrim(rtrim(substring(t.prno, [number],
        charindex(',', t.prno + ',', [number]) - [number])))
    from (select number = row_number() over (order by name) from sys.all_objects) as x
    where number <= len(t.prno) and substring(',' + t.prno, [number], len(',')) = ','
) f

它是独立的,但我建议使用真实的数字表而不是每次飞行时创建序列。此外,子查询可以很容易地转换为UDF。