MSSQL 範例 將資料欄位分割轉多筆資料

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

結果如下

 

我只是一棵樹