我正在撰写一份报告,其中我有一个varchar(max)列,其中的数据以“;”分隔分号。最终用户要求报告拆分这一列并将其作为一系列列返回。
我不知道该怎么做。
根据客户的状态,数据具有可变长度。有些列中只有60个字符,有些列有400多个字符。
数据看起来像这样:
Result 1 = aaaaaaaa; bbbbbbbbbbbb; ccccccccccccccccccccccccc; ddddddddddddd;
Result 2 = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; bbbbbbbbb;
Result 3 = aaaaaaaaaaaaaa; bbbbbbbbbbbbbbb; ccccccccccccccccccccccccc;
另一方面,如果我要打破每个分号部分,我最终会得到40到50列的数据,而其他人可能最终只有3.(如果这是有意义的)
报告中的其他所有内容都是小菜一碟,只是这一栏的分裂让我质疑整个过程。
我想我的问题是: 我如何根据分号分隔符将这一列拆分为多个?
答案 0 :(得分:2)
借助CROSS APPLY和一点点XML。如您所见,XML部分可以根据需要轻松扩展或收缩。
示例强>
Declare @YourTable table (ID int, SomeCol varchar(max))
Insert into @YourTable values
(1,'aaaaaaaa; bbbbbbbbbbbb; ccccccccccccccccccccccccc; ddddddddddddd;'),
(2,'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; bbbbbbbbb;'),
(3,'aaaaaaaaaaaaaa; bbbbbbbbbbbbbbb; ccccccccccccccccccccccccc;')
Select A.ID
,B.*
From @YourTable A
Cross Apply (
Select Pos1 = ltrim(rtrim(xDim.value('/x[1]','varchar(max)')))
,Pos2 = ltrim(rtrim(xDim.value('/x[2]','varchar(max)')))
,Pos3 = ltrim(rtrim(xDim.value('/x[3]','varchar(max)')))
,Pos4 = ltrim(rtrim(xDim.value('/x[4]','varchar(max)')))
,Pos5 = ltrim(rtrim(xDim.value('/x[5]','varchar(max)')))
,Pos6 = ltrim(rtrim(xDim.value('/x[6]','varchar(max)')))
,Pos7 = ltrim(rtrim(xDim.value('/x[7]','varchar(max)')))
,Pos8 = ltrim(rtrim(xDim.value('/x[8]','varchar(max)')))
,Pos9 = ltrim(rtrim(xDim.value('/x[9]','varchar(max)')))
From (Select Cast('<x>' + replace((Select replace(A.SomeCol,';','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml) as xDim) as A
) B
<强>返回强>