[TSQL] 轉資料時如何把許多屬性在同一筆資料內變成多筆

[TSQL] 轉資料時如何把許多屬性在同一筆資料內變成多筆

上禮拜五颱風來襲,就原本要處理的轉檔任務就停了下來,
這次轉檔的情境比較複雜,首先資料內有許多屬性,客戶那邊轉來的Excel呈現到SQL就類似
image
在第12列中,可以看到這因該是一個一對多的連結,所有會有一個資料表專門存這些屬性,
(原始資料中最後沒有 、 符號,是特別為了等一回的程式先加上去的)
第一難題就來了,左想又想,放了颱風假回家想,要如何把資料先從一列變成多列,
在新增回去呢?
第一個想到就是用C#把資料先叫出來再透過 Split 丟到陣列內,這因該是最快的方法,
但心裡想想,T-SQL 一定可以做的到,只是還沒想到,就六日在家想了想,突然想到可以透過
CTE + while 回圈 試看看。
首先呢,因為我的 while 判讀跟拿資料會需要配合資料 、 這個符號,就直接先把每筆資料後面都加上了、
在來步驟如下

-- ?u!B¡Óoa?!B3Ua?!B?oa?!B¢D-aO!B¢Di¡Ó2|¡Ó!BAu2E!B
DECLARE @ArrayList varchar(3000)
SET @ArrayList= '?u!B¡Óoa?!B3Ua?!B?oa?!B¢D-aO!B¢Di¡Ó2|¡Ó!BAu2E!B'

DECLARE @ans Varchar(100)
  -- 當資料有、符號就做處理
WHILE (charindex('!B',@ArrayList)<>0) BEGIN -- 2.取出我要的部分忽略、 SET @ans = SUBSTRING(@ArrayList,0,Charindex('!B',@ArrayList)) PRINT 'ans:'+@ans --塞資料到暫時處理分類的Table  
     --將資料取道第一個資料列
SET @ArrayList = RIGHT(@ArrayList,len(@ArrayList)-Charindex('!B',@ArrayList)) print 'GroupName:' + @ArrayList end 這樣就能看出這樣的效果
image
在 print 改成INSERT INTO 就能夠把這些屬性一筆一筆先塞入暫時的屬性資料表,
在DISTINCT 後,就能夠真正的塞入真正資料表了。
花了兩個小時實做,看來真的T-SQL功力已經退化了。