Käme ich aus der Modebranche, dann hätte ich bei dem folgende Thema ein paar Bilde rim Kopf. Aber lassen wir das... Konzentration auf SQL Server!
Es gibt zwei Arten von Menschen auf dieser Welt: Diejenigen, die alles in einer einzigen, riesigen Spalte speichern wollen, und diejenigen, die wissen, dass es für solche Eskapaden eines Tages den SQL-Server geben wird – mit Funktionen wie STRING_SPLIT. Genauer gesagt: ab SQL Server Kompabilitätsgrad 130.
Die Ursprungsfrage: Wer packt alles in einen String?
Stell dir vor, du kommst am Montagmorgen ins Büro, nimmst einen großen Schluck Kaffee, öffnest deine Datenbank und siehst... nichts als einen langen, zusammenhängenden Text in einer Spalte. Kundenbestellungen, Produkte, Adressen – alles in einem einzigen chaotischen Feld. Der Entwickler, der das verbrochen hat, hat wahrscheinlich schon längst das Weite gesucht und irgendwo einen besseren Job gefunden. An dieser Stelle: sorry Chef... ich muss dich outen :-)
Aber keine Sorge, STRING_SPLIT ist hier, um dein Held zu sein – oder zumindest, um dich davor zu bewahren, deinen Bildschirm aus dem Fenster zu werfen.
Was ist STRING_SPLIT?
Stell dir STRING_SPLIT wie ein Keks vor, der in seine Krümel zerbröselt wird, nur dass es in diesem Fall nicht krümelig, sondern in geordnete Zeilen zerlegt wird. Die Funktion STRING_SPLIT nimmt einen String und trennt ihn anhand eines von dir definierten Trennzeichens auf – zum Beispiel ein Komma, Leerzeichen oder den verzweifelten Schrei nach Hilfe, der in manchen Tabellen latent mitschwingt.
Syntax
Die Syntax ist simpel und beinahe so einfach wie das alphabetische Sortieren eines Einkaufszettels:
1
|
STRING_SPLIT ( string , separator [ , enable_ordinal ] )
|
Wobei seperator das Trennzeichen der Wertedarstellt und enable_ordinal bei 1 eine zusätzliche Spalte ordinal ausgibt (1,2,3,4.....) - ab SQL 2022 und Azure.
Cool, oder? Jetzt könntest du rein theoretisch jeden Datensatz in der Datenbank in kleine, übersichtliche Einzelteile zerlegen – solange ein Komma oder ein anderes Trennzeichen dabei ist. Für Leute, die gerne Ordnung haben, ist das wie Weihnachten und Neujahr zusammen- und den Brückentag nicht vergessen.
STRING_SPLIT – Der wahre Held im Büro
Du hast wahrscheinlich schon oft SQL-Abfragen gesehen, die aussahen wie ein Unfall auf der Autobahn: Verschachtelte Sub-Queries, WHERE-Klauseln, die länger als deine To-Do-Liste sind, und dann noch die berühmte Spalte mit Daten, die irgendwo in einem String versteckt sind. Genau hier kommt STRING_SPLIT ins Spiel. Endlich kannst du diese furchtbaren Listen, die jemand (vielleicht warst du es ja sogar selbst, niemand verurteilt dich hier) in eine einzige Spalte gepackt hat, wieder auseinanderdröseln.
Ein typischer Tag könnte also so aussehen:
- Du hast eine Tabelle namens
Bestellungen
, in der alle Produkte als eine lange, komma-getrennte Liste in der Spalte Produkte
stecken. (Warum? Wir wissen es auch nicht.)
- in einer weitere Tabelle befinden sich die Produktdaten- so wie es sein sollte: in einer Tabelle
- Den Quark dürfen wir nun verarbeiten --> Achtung Burnout Gefahr
Gehen wir mal ein Beispiel durch:
Jetzt seien sie tapfer...! So sieht die Tabelle Bestellungen aus.:
-
Die Lösung
- String_Split als Wertelieferant ist im From zu finden und gibt eine Spalte value zurück
- Aber ich habe die Werte in einer Tabelle.. Verfl..(der restliche Text wurde von der Redaktion zensiert)
- kein Problem mit cross apply. Beachte, daß im Cross Apply sich die Spalte auf Tabelle Bestellungen bezieht.
- ..und wie bringe ich jetzt die Produkttabelle ins Spiel?
Nichts einfacher als das. Du kennst den INNER JOIN..?
Aber natürlich gibt es auch Tücken. STRING_SPLIT hat eine Schwäche: Es gibt keine definierte Reihenfolge der Ergebnisse. Das bedeutet, dass deine Werte manchmal in einer unerwarteten Reihenfolge auftauchen können – wie ein Chaos-Montag, nur dass du ihn in deiner SQL-Abfrage hast.
Die Grenzen von STRING_SPLIT
Wie jeder Superheld hat auch STRING_SPLIT seine kryptonitische Schwäche: Es kümmert sich nicht darum, welche Reihenfolge die Daten ursprünglich hatten. „Reihenfolge? Was soll das sein?“, fragt STRING_SPLIT, während es deine Daten wild auseinanderreißt.
In der Microsoft Doku liest man:
"Die Ausgabezeilen können in beliebiger Reihenfolge sein. Es ist nicht garantiert, dass die Reihenfolge mit der Reihenfolge der Teilzeichenfolgen in der Eingabezeichenfolge übereinstimmt..."
Wenn du also eine Liste von Werten hast, bei der die Reihenfolge tatsächlich wichtig ist (zum Beispiel bei Adressen – niemand möchte eine andere Postleitzahl vor seiner Stadt lesen), dann brauchst du zusätzliche Magie. Vielleicht greifst du zu einem ROW_NUMBER()
-Trick oder freundest dich mit einer anderen Funktion an, die sich etwas mehr um die Reihenfolge sorgt.
Ein weiteres kleines Problemchen sind Leerzeichen nach dem Trennzeichen. Aber frei nach dem Motto beim Friseurbesuch:
"..Mach’s bitte so, dass ich nachher wie frisch von der Steuerprüfung aussehe – ordentlich, aber keiner soll merken, dass was fehlt!.." Wir trimmen einfach die value Spalte.
Fazit
STRING_SPLIT ist wie ein Schweizer Taschenmesser für Datenbanken: kompakt, praktisch und manchmal unerwartet gefährlich. Es kann dir das Leben retten, wenn du mit chaotischen Daten jonglierst, aber du solltest es auch mit Respekt behandeln – besonders, wenn du mehr willst als nur eine chaotische Liste von auseinandergerissenen Daten.
Und das Beste? STRING_SPLIT ist da, um dich daran zu erinnern, dass selbst die schlimmsten Datenbank-Design-Entscheidungen rückgängig gemacht werden können – zumindest solange du ein Komma als Trennzeichen findest.