Ich habe so einen Tisch
Value String
-------------------
1 Cleo, Smith
Ich möchte die durch Kommas getrennte Zeichenfolge in zwei Spalten trennen
Value Name Surname
-------------------
1 Cleo Smith
Ich brauche nur zwei feste zusätzliche Spalten
sql-server
sql-server-2008
csv
Gurru
quelle
quelle
Antworten:
quelle
WHILE
Schleife (noch schlimmer) zusammen werden eine schreckliche Leistung erbringen. Außerdem ist dies eine reine Code- Antwort und löst nicht einmal das Problem. Es gibt viel bessere Ansätze! Für SQL-Server 2016+ suchen Sie nachSTRING_SPLIT()
(was nicht die Position des Fragments trägt, ein großer Fehler!) Oder dem wirklich schnellenJSON
Hack. Für ältere Versionen suchen Sie nach dem bekannten XML-Hack (JSON- und XML-Details hier ). Oder suchen Sie nach einem der Mai-iTVFs, die auf rekursiven CTEs basieren.SELECT * FROM STRING_SPLIT('John,Jeremy,Jack',',')
Ihr Zweck kann mit folgender Abfrage gelöst werden:
Es gibt keine vorgefertigte Split-Funktion in SQL Server, daher müssen wir eine benutzerdefinierte Funktion erstellen.
quelle
SELECT * FROM STRING_SPLIT('John,Jeremy,Jack',',')
und überprüfen Sie auch den Link unten als Referenz
http://jahaines.blogspot.in/2009/06/converting-delimited-string-of-values.html
quelle
CHARINDEX
PlusSUBSTRING
, zumindest für mich. :-(CONVERT(XML,'<Names><name><![CDATA[' + REPLACE(Name,',', ']]></name><name><![CDATA[') + ']]></name></name>') AS xmlname
Die XML-Basisantwort ist einfach und sauber
verweisen Sie dies
quelle
Ich finde das cool
quelle
Mit CROSS APPLY
quelle
Es gibt mehrere Möglichkeiten, dies zu lösen, und es wurden bereits viele verschiedene Möglichkeiten vorgeschlagen. Am einfachsten wäre es,
LEFT
/SUBSTRING
und andere Zeichenfolgenfunktionen zu verwenden, um das gewünschte Ergebnis zu erzielen.Beispieldaten
Verwenden von String-Funktionen wie
LEFT
Dieser Ansatz schlägt fehl, wenn ein String mehr als 2 Elemente enthält. In einem solchen Szenario können wir einen Splitter verwenden und dann
PIVOT
die Zeichenfolge verwenden oder in eine konvertierenXML
und verwenden.nodes
, um Zeichenfolgenelemente abzurufen.XML
Die basierte Lösung wurde von aads und bvr in ihrer Lösung detailliert beschrieben.Die Antworten auf diese Frage, die Splitter verwenden, verwenden alle,
WHILE
die für das Teilen ineffizient sind. Überprüfen Sie diesen Leistungsvergleich . Einer der besten Splitter istDelimitedSplit8K
Jeff Moden. Sie können mehr darüber lesen Sie hierSplitter mit
PIVOT
Ausgabe
DelimitedSplit8K
von Jeff Modenquelle
Versuchen Sie dies (ändern Sie die Instanzen von '' in '' oder einen beliebigen Begrenzer, den Sie verwenden möchten).
Anwendungsbeispiel:
quelle
Mit SQL Server 2016 können wir string_split verwenden, um dies zu erreichen:
quelle
Invalid object name 'string_split'
DECLARE @cl TINYINT; SELECT @cl = compatibility_level FROM [sys].[databases] WHERE name = 'mydb'; IF @cl < 130 BEGIN ALTER DATABASE myDb SET COMPATIBILITY_LEVEL = 130 END;
Ich denke, PARSENAME ist die nette Funktion für dieses Beispiel, wie in diesem Artikel beschrieben: http://www.sqlshack.com/parsing-and-rotating-delimited-data-in-sql-server-2012/
Die Funktion PARSENAME ist logisch ausgelegt, um vierteilige Objektnamen zu analysieren. Das Schöne an PARSENAME ist, dass es nicht nur auf das Parsen von vierteiligen SQL Server-Objektnamen beschränkt ist, sondern auch auf Funktions- oder Zeichenfolgendaten, die durch Punkte begrenzt sind.
Der erste Parameter ist das zu analysierende Objekt und der zweite ist der ganzzahlige Wert des zurückzugebenden Objektstücks. Der Artikel befasst sich mit dem Parsen und Drehen von begrenzten Daten - Firmen-Telefonnummern, kann jedoch auch zum Parsen von Vor- / Nachnamen verwendet werden.
Beispiel:
In diesem Artikel wird auch die Verwendung eines Common Table Expression (CTE) mit dem Namen 'replaceChars' beschrieben, um PARSENAME für die durch Trennzeichen ersetzten Werte auszuführen. Ein CTE ist nützlich, um eine temporäre Ansicht oder Ergebnismenge zurückzugeben.
Danach wurde die UNPIVOT-Funktion verwendet, um einige Spalten in Zeilen zu konvertieren. Die Funktionen SUBSTRING und CHARINDEX wurden zum Bereinigen der Inkonsistenzen in den Daten verwendet, und die LAG-Funktion (neu für SQL Server 2012) wurde am Ende verwendet, da sie das Referenzieren früherer Datensätze ermöglicht.
quelle
quelle
Wir können eine Funktion wie diese erstellen
Anschließend können wir die CSV-Werte mithilfe einer SELECT-Anweisung in unsere jeweiligen Spalten aufteilen
quelle
Ich denke, folgende Funktion wird für Sie funktionieren:
Sie müssen zuerst eine Funktion in SQL erstellen. So was
Sie können diese Funktion folgendermaßen aufrufen:
Implementierung:
Ergebnis wird dies gefallen:
quelle
Sie können eine Tabellenfunktion verwenden
STRING_SPLIT
, die nur unter der Kompatibilitätsstufe 130 verfügbar ist. Wenn Ihre Datenbankkompatibilitätsstufe unter 130 liegt, kann SQL Server dieSTRING_SPLIT
Funktion nicht finden und ausführen . Sie können eine Kompatibilitätsstufe der Datenbank mit dem folgenden Befehl ändern:Syntax
siehe Dokumentation hier
quelle
Verwenden Sie die Funktion Parsename ()
Ergebnis
quelle
Versuche dies:
quelle
Ich bin auf ein ähnliches Problem gestoßen, aber auf ein komplexes. Da dies der erste Thread ist, den ich zu diesem Problem gefunden habe, habe ich beschlossen, meinen Befund zu veröffentlichen. Ich weiß, dass es eine komplexe Lösung für ein einfaches Problem ist, aber ich hoffe, dass ich anderen Menschen helfen kann, die zu diesem Thread gehen und nach einer komplexeren Lösung suchen. Ich musste eine Zeichenfolge mit 5 Zahlen (Spaltenname: LevelsFeed) teilen und jede Zahl in einer separaten Spalte anzeigen. Zum Beispiel: 8,1,2,2,2 sollte wie folgt angezeigt werden:
Lösung 1: Verwenden von XML-Funktionen: Diese Lösung ist mit Abstand die langsamste Lösung
Lösung 2: Verwenden der Split-Funktion und des Pivots. (Die Split-Funktion teilt eine Zeichenfolge in Zeilen mit dem Spaltennamen Data auf.)
Lösung 3: Verwenden von Funktionen zur Manipulation von Zeichenfolgen - am schnellsten mit geringem Abstand gegenüber Lösung 2
Da die EbenenFeed 5 Zeichenfolgenwerte enthält, musste ich die Teilzeichenfolgenfunktion für die erste Zeichenfolge verwenden.
Ich hoffe, dass meine Lösung anderen helfen wird, die zu diesem Thread gekommen sind und nach einer komplexeren Methode zur Aufteilung in Spalten suchen
quelle
Instring-Funktion verwenden :)
Verwendete zwei Funktionen:
1.
substring(string, position, length)
==> gibt den String von Position zu Länge zurück2.
instr(string,pattern)
==> gibt die Position des Musters zurück.Wenn wir im Teilstring kein Längenargument angeben, wird es bis zum Ende des Strings zurückgegeben
quelle
substring(@str, 1, charindex(@sep, @str) - 1)
gefolgt von verwendensubstring(@str, charindex(@sep, @str) + 1, len(@str))
.Diese Funktion ist am schnellsten:
Anwendungsbeispiel:
quelle
Das hat bei mir funktioniert
quelle
mein Tisch:
Folgendes sollte funktionieren, wenn nicht zu viele Spalten vorhanden sind
Ergebnis:
quelle
Es ist so einfach, dass Sie es mit der folgenden Abfrage beantworten können:
quelle
quelle
Möglicherweise finden Sie die Lösung in SQL User Defined Function zum Parsen einer durch Trennzeichen getrennten Zeichenfolge hilfreich (aus The Code Project ).
Dies ist der Codeteil dieser Seite:
quelle
quelle
Ich fand heraus, dass die Verwendung von PARSENAME wie oben dazu führte, dass ein Name mit einem Punkt auf Null gesetzt wurde.
Wenn der Name also eine Initiale oder einen Titel gefolgt von einem Punkt enthält, wird NULL zurückgegeben.
Ich fand das funktionierte für mich:
quelle
quelle
quelle
Ich habe oben eine Antwort neu geschrieben und sie verbessert:
Anwendungsbeispiel:
quelle
quelle