上禮拜五颱風來襲,就原本要處理的轉檔任務就停了下來, 這次轉檔的情境比較複雜,首先資料內有許多屬性,客戶那邊轉來的Excel呈現到SQL就類似 在第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 這樣就能看出這樣的效果 在 print 改成INSERT INTO 就能夠把這些屬性一筆一筆先塞入暫時的屬性資料表,在DISTINCT 後,就能夠真正的塞入真正資料表了。花了兩個小時實做,看來真的T-SQL功力已經退化了。