MSSQL 範例 欄位分割 轉多筆資料 正規畫
原始資料
SQL語法
--前面假資料設定
--移除暫存資料
IF OBJECT_ID('tempdb..[#tmpRawData]') IS NOT NULL
DROP TABLE #tmpRawData
IF OBJECT_ID('tempdb..[#TMP]') IS NOT NULL
DROP TABLE #TMP
--建立 原始資料當範例
CREATE TABLE #tmpRawData (
[id] INT
,[item] [varchar] (100)
,[detailed] [varchar] (100)
)
--加多筆範例資料
INSERT INTO #tmpRawData ([id], [item], [detailed])
SELECT 23 ,'銅板' ,'1元;5元;10元;20元;50元'
UNION ALL
SELECT 28 ,'紙鈔' ,'100元;200元;500元'
UNION ALL
SELECT 31 ,'大鈔' ,'1000元;2000元'
--正規劃開始
--確認分割符號
DECLARE @separator VARCHAR(1)
SELECT @separator = ';'
--先建立 TMP TABLE
CREATE TABLE #TMP (
[tmp01] [varchar] (100)
,[tmp02] [varchar] (100)
,[tmp03] [varchar] (100)
)
-- 宣告
DECLARE @CONTENT VARCHAR(300)
DECLARE @Field1 VARCHAR(300)
DECLARE @Field2 VARCHAR(300)
DECLARE @Field3 VARCHAR(300)
-- 將資料載入(可修改為真正需要的資料)
DECLARE CUR_1 CURSOR FOR
SELECT
[id]
,[detailed] --主要分解欄位
,[item]
FROM #tmpRawData
OPEN CUR_1
--取第一筆資料
FETCH NEXT FROM CUR_1 INTO @Field1,@Field2,@Field3
--判斷資料是否到底
WHILE (@@fetch_status <> -1)
BEGIN
SET @CONTENT = @Field2
PRINT @CONTENT
--判斷有無找到分割符號
WHILE( CHARINDEX(@separator,@CONTENT)<>0 )
BEGIN
--寫入暫存,欄位內容拆解後(1 ~ n-1)資料
INSERT INTO #TMP (tmp01, tmp02, tmp03)
VALUES (@Field1, SUBSTRING(@CONTENT, 1, CHARINDEX(@separator, @CONTENT) - 1), @Field3)
SET @CONTENT = SUBSTRING(@CONTENT, CHARINDEX(@separator, @CONTENT) + 1, LEN(@CONTENT))
END
--寫入暫存,欄位內容中最後一筆資料
INSERT INTO #TMP (tmp01, tmp02, tmp03)
VALUES (@Field1, RTRIM(@CONTENT), @Field3)
FETCH NEXT FROM CUR_1 INTO @Field1, @Field2, @Field3
END
CLOSE CUR_1
DEALLOCATE CUR_1
-- 確認資料
SELECT tmp01 ,tmp03 ,tmp02
FROM #TMP
WHERE 1 = 1
ORDER BY tmp01 ,tmp03
結果如下
我只是一棵樹