Effizienter Weg, um string-split mit CTE

Ich habe eine Tabelle, die so aussieht wie

ID  Layout
1   hello,world,welcome,to,tsql
2   welcome,to,stackoverflow

Die gewünschte Ausgabe sollte

Id  Splitdata
1   hello
1   world
1   welcome
1   to
1   tsql
2   welcome
2   to
2   stackoverflow

Habe ich dies getan, indem Sie die folgenden Abfrage

Declare @t TABLE(
    ID  INT IDENTITY PRIMARY KEY,
    Layout VARCHAR(MAX)
)
INSERT INTO @t(Layout)
SELECT 'hello,world,welcome,to,tsql' union all
SELECT 'welcome,to,stackoverflow'
--SELECT * FROM @t
;With cte AS(
select F1.id
 ,O.splitdata 
 from
 (
 select *,
 cast('<X>'+replace(F.Layout,',','</X><X>')+'</X>' as XML) as xmlfilter
 from @t F
 )F1
 cross apply
 ( 
 select fdata.D.value('.','varchar(MAX)') as splitdata 
 from f1.xmlfilter.nodes('X') as fdata(D)) O
 )

 select * from cte

Aber Leistung klug, es ist sehr schlecht. Ich bin auf der Suche nach einer effizienteren Abfrage aber mit CTE nur.

Bitte helfen

Dank

Versuchen Sie die proc in [ diesem Beitrag](wisesoft.co.uk/scripts/t-sql_cte_split_string_function.aspx), wo Sie die Rekursion zu trennen. Ich denke, man kann es anpassen. Dieser verwendet einen Allgemeinen Tabellenausdruck.
während ich mit Ihnen überein es gibt manchmal gute Gründe, zu wissen, wie man diese effizient. Speziell schrubben schlecht Daten kommen aus einem integrierten system, wo müssen Sie führen die routine, als einen job auf einem regelmäßigen Zyklus. Ich denke, die Antwort wird aufschlussreich und hilfreich für andere.
Einverstanden, und mein Kommentar hat einige übertreibung in der it. Deshalb ist es ein Kommentar, und keine Antwort. Aber ich denke auch, es ist wichtig, dass die Ankündigung gut platziert und gut gestimmt, für die unvorsichtigen.
Ich kann nicht behaupten, dass mit. Ich kann auch nicht behaupten, mit CSV=666!
Wie funktioniert mit einem CTE-T-SQL besser zu string Parsen?

InformationsquelleAutor aditi | 2011-06-17

Schreibe einen Kommentar