[英]Expand Single Delimited Field into Multiple Columns/Rows
我在名為Body
的SQL表中有一個文本字段,其中包含多行定界的文本(例如,請參見下面的數據)。 我在尋找與分裂的SQL查詢的幫助,
分隔的數據到多個行和列,到我可以在視圖中引用的臨時表。
74,232,3,2700,2619,524,C,0,0,1,47,90,537,9355,0,PA,1,1,SCO1DS,,0,0
74,232,6,5400,5238,1048,C,0,0,1,47,81,546,6362,0,PB,1,1,INT3DS,,0,0
74,232,6,837,810,162,C,0,0,75,55,121,100,N694297,0,PC,6,1,GLA2,,0,0
74,232,8,884,857,171,C,0,0,2,45,90,766,6492,0,PW,8,1,WOL1DS,,0,0
我只使用了10個字段,您可以根據需要使用任意多個字段。
DECLARE @t TABLE (Body VARCHAR(MAX))
INSERT INTO @t VALUES
('74,232,3,2700,2619,524,C,0,0,1,47,90,537,9355,0,PA,1,1,SCO1DS,,0,0'),
('74,232,6,5400,5238,1048,C,0,0,1,47,81,546,6362,0,PB,1,1,INT3DS,,0,0'),
('74,232,6,837,810,162,C,0,0,75,55,121,100,N694297,0,PC,6,1,GLA2,,0,0'),
('74,232,8,884,857,171,C,0,0,2,45,90,766,6492,0,PW,8,1,WOL1DS,,0,0');
WITH Split_Fields (ID,xmlfields)
AS
(
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) ID
,CONVERT(XML,'<Fields><field>'
+ REPLACE(Body,',', '</field><field>') + '</field></Fields>') AS xmlfields
FROM @t
)
SELECT ID
,xmlfields.value('/Fields[1]/field[1]','varchar(100)') AS Field1
,xmlfields.value('/Fields[1]/field[2]','varchar(100)') AS Field2
,xmlfields.value('/Fields[1]/field[3]','varchar(100)') AS Field3
,xmlfields.value('/Fields[1]/field[4]','varchar(100)') AS Field4
,xmlfields.value('/Fields[1]/field[5]','varchar(100)') AS Field5
,xmlfields.value('/Fields[1]/field[6]','varchar(100)') AS Field6
,xmlfields.value('/Fields[1]/field[7]','varchar(100)') AS Field7
,xmlfields.value('/Fields[1]/field[8]','varchar(100)') AS Field8
,xmlfields.value('/Fields[1]/field[9]','varchar(100)') AS Field9
,xmlfields.value('/Fields[1]/field[10]','varchar(100)') AS Field10
FROM Split_Fields
╔════╦════════╦════════╦════════╦════════╦════════╦════════╦════════╦════════╦════════╦═════════╗
║ ID ║ Field1 ║ Field2 ║ Field3 ║ Field4 ║ Field5 ║ Field6 ║ Field7 ║ Field8 ║ Field9 ║ Field10 ║
╠════╬════════╬════════╬════════╬════════╬════════╬════════╬════════╬════════╬════════╬═════════╣
║ 1 ║ 74 ║ 232 ║ 3 ║ 2700 ║ 2619 ║ 524 ║ C ║ 0 ║ 0 ║ 1 ║
║ 2 ║ 74 ║ 232 ║ 6 ║ 5400 ║ 5238 ║ 1048 ║ C ║ 0 ║ 0 ║ 1 ║
║ 3 ║ 74 ║ 232 ║ 6 ║ 837 ║ 810 ║ 162 ║ C ║ 0 ║ 0 ║ 75 ║
║ 4 ║ 74 ║ 232 ║ 8 ║ 884 ║ 857 ║ 171 ║ C ║ 0 ║ 0 ║ 2 ║
╚════╩════════╩════════╩════════╩════════╩════════╩════════╩════════╩════════╩════════╩═════════╝
亞倫·貝特朗(Aaron Betrand)很好地介紹了如何在此處完成類似的操作。
最佳性能來自CLR。
CREATE ASSEMBLY CLRUtilities FROM 'c:\DLLs\CLRUtilities.dll'
WITH PERMISSION_SET = SAFE;
GO
CREATE FUNCTION dbo.SplitStrings_CLR
(
@List NVARCHAR(MAX),
@Delimiter NVARCHAR(255)
)
RETURNS TABLE ( Item NVARCHAR(4000) )
EXTERNAL NAME CLRUtilities.UserDefinedFunctions.SplitString_Multi;
GO
通過使用他的一個示例,您可以擴展它以將字符串寫入臨時表。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.