Split Zeichenfolge in Tabelle mit Zeilen- und Spaltenbegrenzer in SQL Server

Wie wird eine Zeichenfolge mit einer Matrix in eine Tabelle in SQL Server aufgeteilt? String hat Spalten- und Zeilenbegrenzer.

Angenommen, ich habe eine Zeichenfolge:

declare @str varchar(max)='A,B,C;D,E,F;X,Y,Z';

Erwartete Ergebnisse (in drei separaten Spalten):

+---+---+---+
| A | B | C |
+---+---+---+
| D | E | F |
+---+---+---+
| X | Y | Z |
+---+---+---+

Ich suche nach einer allgemeinen Lösung, bei der die Anzahl der Spalten und Zeilen nicht definiert ist. Also die Zeichenfolge:

declare @str varchar(max)='A,B;D,E';

wird in eine Tabelle mit zwei Spalten aufgeteilt:

+---+---+
| A | B |
+---+---+
| D | E |
+---+---+

Meine Bemühungen. Meine erste Idee war, dynamisches SQL zu verwenden, das den String in: @ verwandelinsert into dbo.temp values (...) Dieser Ansatz ist zwar sehr schnell, hat aber einen kleinen Nachteil, da zuerst eine Tabelle mit der richtigen Anzahl von Spalten erstellt werden muss. Ich habe diese Methode in @ vorgesteldie Antwort auf meine eigene Frage unten Nur um die Frage kurz zu halten.

Eine weitere Idee wäre, die Zeichenfolge in eine CSV-Datei auf dem Server zu schreiben und dannbulk insert davon. Obwohl ich nicht weiß, wie ich es machen soll und was die Leistung der ersten und zweiten Idee wäre.

Der Grund, warum ich die Frage gestellt habe, ist, dass ich Daten aus Excel in SQL Server importieren möchte. Da ich mit verschiedenen ADO-Ansätzen experimentiert habe, ist diese Methode zum Senden von Matrix-Strings ein Erdrutschsieg, insbesondere wenn die Länge des Strings zunimmt. Ich habe einem jüngeren Zwillingsbruder die Frage hier gestellt: Excel-Bereich in VBA-Zeichenfolge umwandeln Hier finden Sie Vorschläge, wie Sie eine solche Zeichenfolge aus dem Excel-Bereich vorbereiten können.

Kopfgel Ich entschied mich zu vergeben Matt. Ich wog hoch Sean Lange's Antworten. Vielen Dank, Sean. Ich mochte Matts Antwort wegen seiner Einfachheit und Kürze. Andere Ansätze als Matt's und Sean's könnten parallel verwendet werden, so dass ich momentan keine Antwort akzeptiere (Update: Nach ein paar Monaten habe ich Matt's Antwort akzeptiert). Ich möchte mich bei @ bedankAhmed Saeed für seine Idee mit VALUES, denn es ist eine schöne Weiterentwicklung der Antwort, mit der ich begonnen habe. Natürlich kann es nicht mit Matt oder Sean mithalten. Ich habe jede Antwort positiv bewertet. Ich freue mich über Ihr Feedback zur Verwendung dieser Methoden. Vielen Dank für die Suche.

Antworten auf die Frage(24)

Ihre Antwort auf die Frage