SQL Server 2016 a introduit STRING_SPLIT qui est très rapide et un excellent remplacement pour toute implémentation maison que les gens déploieraient avant 2016.
Malheureusement, STRING_SPLIT ne prend en charge qu'un séparateur à un seul caractère, ce qui n'est pas toujours suffisant. Quelqu'un connaît-il une bonne implémentation qui permet d'utiliser plusieurs caractères dans le séparateur?
Eh bien, vous pouvez toujours utiliser REPLACE
pour ajouter un délimiteur à un caractère à l'argument avant de le passer. Il vous suffit de choisir un caractère qui est peu probable/impossible d'apparaître dans les données réelles. Dans cet exemple, supposons que vos données d'origine utilisent trois canaux comme délimiteur; J'ai choisi un caractère Unicode au hasard pour remplacer:
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);
J'ai blogué à ce sujet plus en détail ici:
Adresser un commentaire:
mauvaise solution. que faire si la chaîne d'origine est comme 'abc || pqr ||| rst || 123' (dynamique et peut contenir n'importe quoi). o/p souhaité est 'abc || pqr' et 'rst || 123' mais votre solution donnera 'abc' 'pqr' 'rst' '123'
D'accord, prenons votre entrée et voyons si ma solution obtient la mauvaise sortie.
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);
Le résultat est:
abc||pqr
rst||123
Et pas ce que vous devez avoir supposé (mais pas testé) ceci:
abc
pqr
rst
123
Si vos données sont dans une table, vous pouvez créer une vue afin de ne pas avoir à factoriser cette expression dans toutes vos requêtes.
Si cela ne fonctionne pas, car vous pourriez avoir un crayon (✏
) Dans vos données et vous ne pouvez pas trouver un seul caractère dans le 1 111 998 caractères Unicode disponibles qui a gagné ' t être dans votre ensemble de données, vous devrez ignorer STRING_SPLIT()
, car il est codé en dur pour accepter un délimiteur à un seul caractère ( separator Is a single character expression
).
Les alternatives ont été répondues ici des dizaines de fois auparavant , beaucoup avant que STRING_SPLIT()
n'existe. Ces méthodes fonctionnent toujours.
Je passe en revue de nombreuses alternatives et je discute également des limitations dans STRING_SPLIT()
, dans cette série (je discute également pourquoi vous pourriez envisager de ne pas le faire dans T-SQL en utilisant une méthode du tout):