2017-04-06 67 views
1

我寫了一個報告,其中有一個varchar(max)列,其中的數據由「;」分隔,分號。最終用戶要求報告分解這一列並將其作爲一系列列返回。基於分號將Varchar max字段拆分爲多個列

我不知道如何做到這一點。

根據客戶的狀態,數據具有可變長度。有些列只有60個字符,有些字符有400多個字符。

的數據看起來有點像這樣:

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

這樣做的另一面是,如果我出打破各分號段,我最終可能會以40 - 數據價值50列,而其他人可能最終只是3.(如果這是有道理的)

報告中的其他一切都是小菜一碟,它只是分裂這一列,讓我質疑整個努力。

我想我這裏的問題是: 我如何將這一列拆分爲多個基於分號的分隔符?

+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僅供參考,CROSS APPLY中的代碼可以創建一個良好的TVF,將字符串和分隔符作爲參數傳遞。因此,替換(A.SomeCol,';'變成替換(@ String,@ Delimiter –