Nun, Sie können REPLACE
dem Argument immer ein Einzelzeichen-Trennzeichen hinzufügen, bevor Sie es übergeben. Sie müssen nur ein Zeichen auswählen, das in den tatsächlichen Daten wahrscheinlich / unmöglich erscheint. Nehmen wir in diesem Beispiel an, Ihre Originaldaten verwenden drei Pipes als Trennzeichen. Ich habe zufällig ein Unicode-Zeichen ausgewählt, um Folgendes zu ersetzen:
DECLARE
@olddelim nvarchar(32) = N'|||',
@newdelim nchar(1) = NCHAR(9999); -- pencil (✏)
DECLARE @x nvarchar(max) = N'foo|||bar|||blat|||splunge';
SELECT * FROM STRING_SPLIT(REPLACE(@x, @olddelim, @newdelim), @newdelim);
Ich habe hier ausführlicher darüber gebloggt:
Kommentar adressieren:
schlechte Lösung. Was ist, wenn die ursprüngliche Zeichenfolge wie 'abc || pqr ||| rst || 123' ist (dynamisch und kann alles enthalten)? Das gewünschte O / P ist 'abc || pqr' und 'rst || 123', aber Ihre Lösung ergibt 'abc' 'pqr' 'rst' '123'
Okay, nehmen wir Ihre Eingabe und sehen, ob meine Lösung die falsche Ausgabe erhält.
DECLARE
@olddelim nvarchar(32) = N'|||',
@newdelim nchar(1) = NCHAR(9999); -- pencil (✏)
DECLARE @x nvarchar(max) = N'abc||pqr|||rst||123';
SELECT * FROM STRING_SPLIT(REPLACE(@x, @olddelim, @newdelim), @newdelim);
Ergebnis ist:
abc||pqr
rst||123
Und nicht das, was Sie angenommen haben müssen (aber nicht getestet haben):
abc
pqr
rst
123
Wenn sich Ihre Daten in einer Tabelle befinden, können Sie eine Ansicht erstellen, damit Sie diesen Ausdruck nicht in alle Ihre Abfragen einbeziehen müssen.
Wenn dies nicht funktioniert, weil ✏
Ihre Daten möglicherweise einen Stift ( ) enthalten und Sie in den 1.111.998 verfügbaren Unicode-Zeichen , die nicht in Ihrem Datensatz enthalten sind, kein einziges Zeichen finden , müssen Sie überspringen STRING_SPLIT()
, da es fest codiert ist, ein einzelnes Zeichenbegrenzer ( separator
Is a single character expression
) zu akzeptieren .
Alternativen wurden hier schon Dutzende Male beantwortet , viele vorher STRING_SPLIT()
existierten. Diese Methoden funktionieren immer noch.
Ich gehe STRING_SPLIT()
in dieser Reihe auf viele Alternativen ein und diskutiere auch die Einschränkungen in (ich diskutiere auch, warum Sie in Betracht ziehen könnten, dies in T-SQL überhaupt nicht mit einer Methode zu tun):