簡體   English   中英

將單個定界字段擴展為多列/行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM