將多列字符串 分割成多行數據


SELECT Name FROM SysObjects Where XType='U' ORDER BY Name --讀取庫中的所有表名 cafe  
 -----------------

 --測試數據
IF OBJECT_ID('tempdb..#tab') IS NOT NULL
    DROP TABLE #tab
CREATE TABLE #tab(
id INT,
VALUE VARCHAR(20),
NAME VARCHAR(20)   
)
INSERT INTO #tab
SELECT 1,'12|23','你好,hello' union all
SELECT 1,'456|1|35','Abc,efc,kkk' UNION ALL
SELECT 2,'12','pppp'
--測試數據結束
 select * from #tab
 go
			 CREATE FUNCTION [dbo].[ufn_SplitStringToTable]
			(
			  @str VARCHAR(MAX) ,
			  @split VARCHAR(10)
			)
			RETURNS TABLE
				AS 
			RETURN
				( SELECT    B.id
				  FROM      ( SELECT    [value] = CONVERT(XML , '<v>' + REPLACE(@str , @split , '</v><v>')
										+ '</v>')
							) A
				  OUTER APPLY ( SELECT  id = N.v.value('.' , 'varchar(100)')
								FROM    A.[value].nodes('/v') N ( v )
							  ) B
				)
 go

IF OBJECT_ID('tempdb..#t') IS NOT NULL
    DROP TABLE #t
SELECT a.id AS id_mstr,a.[VALUE],a.name,b.*,identity (int,1,1) as rn into #t FROM #tab a
OUTER APPLY ufn_SplitStringToTable(a.[VALUE],'|') b
IF OBJECT_ID('tempdb..#t2') IS NOT NULL
    DROP TABLE #t2
SELECT a.id AS id_mstr,a.[VALUE],a.name,b.*,identity (int,1,1) as rn into #t2 FROM #tab a
OUTER APPLY dbo.ufn_SplitStringToTable(a.name,',') b
 go
SELECT a.id_mstr,
       a.value,
       a.name,
       a.id  AS value_n,
       b.id  AS name_n
FROM   #t a
       INNER JOIN #t2 b
            ON  a.rn = b.rn
            AND a.id_mstr = b.id_mstr
            AND a.value = b.value

 

這樣就把數據給進行轉換了。 根據字符 | 進行分割出來的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章