Ich möchte '1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 ...' (durch Kommas getrennt) in eine Tabelle oder Tabellenvariable aufteilen .
Hat jemand eine Funktion, die jede nacheinander zurückgibt?
sql
sql-server
tsql
sql-server-2008
jinsungy
quelle
quelle
Antworten:
Hier ist eine etwas altmodische Lösung:
In SQL Server 2008 können Sie dasselbe mit .NET-Code erreichen. Vielleicht würde es schneller funktionieren, aber definitiv ist dieser Ansatz einfacher zu verwalten.
quelle
Versuche dies
ODER
Viele weitere Möglichkeiten, dasselbe zu tun, finden Sie hier. Wie wird eine durch Kommas getrennte Zeichenfolge aufgeteilt?
quelle
<
,>
oder&
(z. B. ist die Eingabe eine Folge von Ganzzahlen). Jedes der oben genannten drei Zeichen führt dazu, dass anstelle des erwarteten Ergebnisses ein Analysefehler angezeigt wird.SELECT b, CHARINDEX(@delimiter, @str, b) + LEN(@delimiter)
sollte eigentlich seinSELECT b, CHARINDEX(@delimiter, @str, b+1) + LEN(@delimiter)
. Das b + 1 macht einen großen Unterschied. Hier mit Leerzeichen als Trennzeichen getestet, funktionierte ohne dieses Update nicht.MAXRECURSION
Option hinzufügen möchten, um mehr als 100 Teile zu teilen, durchLEN
etwas von stackoverflow.com/q/2025585 zu ersetzen, um Leerzeichen zu verarbeiten, undNULL
Zeilen fürNULL
Eingaben auszuschließen .Sie haben diesen SQL Server 2008 markiert, aber zukünftige Besucher dieser Frage (mit SQL Server 2016+) möchten wahrscheinlich etwas darüber wissen
STRING_SPLIT
.Mit dieser neu eingebauten Funktion können Sie jetzt einfach verwenden
Einige Einschränkungen dieser Funktion und einige vielversprechende Ergebnisse von Leistungstests sind in diesem Blog-Beitrag von Aaron Bertrand enthalten .
quelle
Dies ähnelt am ehesten .NET für diejenigen unter Ihnen, die mit dieser Funktion vertraut sind:
quelle
Hier ist die Split-Funktion, die du gefragt hast
Führen Sie die Funktion folgendermaßen aus
quelle
Quelle dieser Antwort: http://sqlhint.com/sqlserver/how-to/best-split-function-tsql-delimited
quelle
Ich bin versucht, meine Lieblingslösung einzudrücken. Die resultierende Tabelle besteht aus 2 Spalten: PosIdx für die Position der gefundenen Ganzzahl; und Wert in Ganzzahl.
Es verwendet rekursiven CTE als Liste der Positionen, standardmäßig von 1 bis 100. Wenn Sie mit einer Zeichenfolge arbeiten müssen, die länger als 100 ist, rufen Sie diese Funktion einfach mit 'option (maxrecursion 4000)' wie folgt auf:
quelle
Verwendung
quelle
Dieser einfache CTE gibt an, was benötigt wird:
quelle
Dies ist eine andere Version, die wirklich keine Einschränkungen hat (z. B. Sonderzeichen bei Verwendung des XML-Ansatzes, Anzahl der Datensätze im CTE-Ansatz) und die viel schneller ausgeführt wird, basierend auf einem Test mit mehr als 10 Millionen Datensätzen mit einer durchschnittlichen Länge der Quellzeichenfolge von 4000. Hoffe dies könnte helfen.
quelle
Die Verwendung der Tally-Tabelle ist eine Split-String-Funktion (bestmöglicher Ansatz) von Jeff Moden
Empfohlen von Tally OH! Eine verbesserte SQL 8K "CSV Splitter" -Funktion
quelle
Dieser Blog lieferte eine ziemlich gute Lösung für die Verwendung von XML in T-SQL.
Dies ist die Funktion, die ich basierend auf diesem Blog entwickelt habe (Ändern Sie den Funktionsnamen und den Ergebnistyp je nach Bedarf):
quelle
quelle
quelle
Sie schreiben diese Funktion in SQL Server, nachdem dieses Problem behoben ist.
http://csharpdotnetsol.blogspot.in/2013/12/csv-function-in-sql-server-for-divide.html
quelle