2017-04-06 13 views
1

";"で区切られたデータを持つvarchar(max)列を持つレポートを作成しています。セミコロン。エンドユーザーは、この1つの列を分解して一連の列として戻すようにレポートを要求しています。セミコロンに基づいて複数の列に分割するVarcharの最大フィールド

私はこれを行う方法がわかりません。

データの長さは、顧客のステータスに基づいています。列の中には60文字しかないものもあれば、400文字以上あるものもあります。

データはいくらか次のようになります。

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

本のフリップサイドは、私は、各セミコロンセクションを破るした場合、私は40ので終わるかもしれないということです - 他の一方で、データの価値が50列

レポートの他のすべてはケーキですが、この1つの列を分割するだけで、私は全体の努力に疑問を呈しています。

私の質問はここにあります: セミコロン区切り記号に基づいて複数の列に分割する方法を教えてください。

+0

タフ運...そのようなデータを保存するには、多くの問題を引き起こします。 – jarlh

+0

そうです。この特定のセットアップではじめてお尻を持っているのは初めてのことではありません – user1949329

答えて

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

+0

今すぐ試してみてください!応答ありがとうございました – user1949329

+0

@ user1949329私は醜い構造を継承しました。 –

+0

@ user1949329 FYI、CROSS APPLY内のコードは、文字列と区切り文字をパラメータとして渡す良いTVFを作成します。だから置換する(A.SomeCol、 ';'はreplace(@ String、@Delimiter –

関連する問題