基于分号将Varchar max字段拆分为多个列

时间:2017-04-06 14:37:09

标签: sql tsql sql-server-2012

我正在撰写一份报告,其中我有一个varchar(max)列,其中的数据以“;”分隔分号。最终用户要求报告拆分这一列并将其作为一系列列返回。

我不知道该怎么做。

根据客户的状态,数据具有可变长度。有些列中只有60个字符,有些列有400多个字符。

数据看起来像这样:

Result 1 = aaaaaaaa; bbbbbbbbbbbb; ccccccccccccccccccccccccc; ddddddddddddd;
Result 2 = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; bbbbbbbbb;
Result 3 = aaaaaaaaaaaaaa; bbbbbbbbbbbbbbb; ccccccccccccccccccccccccc;

另一方面,如果我要打破每个分号部分,我最终会得到40到50列的数据,而其他人可能最终只有3.(如果这是有意义的)

报告中的其他所有内容都是小菜一碟,只是这一栏的分裂让我质疑整个过程。

我想我的问题是: 我如何根据分号分隔符将这一列拆分为多个?

1 个答案:

答案 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

<强>返回

enter image description here