Développer Champ délimité unique en plusieurs colonnes / lignes

J'ai un champ de text dans une table SQL appelée Body qui contient du text délimité multiligne (voir datatables ci-dessous par exemple). Je search de l'aide avec une requête SQL qui divise datatables délimitées en plusieurs lignes et colonnes dans une table temporaire que je peux referencer dans une vue.

 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 

J'ai seulement utilisé 10 champs que vous pouvez utiliser autant que vous le souhaitez.

Données de test

 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'); 

Question

 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 

Résultat

 ╔════╦════════╦════════╦════════╦════════╦════════╦════════╦════════╦════════╦════════╦═════════╗ ║ 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 a une bonne description de la façon dont vous pouvez faire quelque chose de similaire ici .

La meilleure performance est venue du CLR.

 CREATE ASSEMBLY CLRUtilities FROM 'c:\DLLs\CLRUtilities.dll' WITH PERMISSION_SET = SAFE; GO CREATE FUNCTION dbo.SplitSsortingngs_CLR ( @List NVARCHAR(MAX), @Delimiter NVARCHAR(255) ) RETURNS TABLE ( Item NVARCHAR(4000) ) EXTERNAL NAME CLRUtilities.UserDefinedFunctions.SplitSsortingng_Multi; GO 

En utilisant l'un de ses exemples, vous pouvez l'étendre pour écrire les strings dans une table temporaire.