Saviez-vous qu’une fonction native STRING_SPLIT intégrée à SQL Server a été ajoutée dans SQL Server 2016 ? En tant que consultant, je vois tellement de code qui font appel à une fonction scalaire qui sont utilisés pour diviser les variables délimitées par des chaînes de caractères en une liste utilisable. Pour ceux qui utilisent cette méthode, je vous suggère de regarder cette fonction. STRING_SPLIT est une fonction à valeur de tableau qui renvoie une seule colonne de vos valeurs de chaîne séparées par le délimiteur. Il s’agit d’une partie inhabituelle de T-SQL, dans la mesure où le niveau de compatibilité 130 ou plus est requis pour son utilisation (Microsoft ne voulait pas induire des changements cassants dans le code utilisateur existant). L’utilisation de cette méthode est bien plus efficace et peut être exécutée sans appeler une fonction scalaire.
La syntaxe
STRING_SPLIT ( string , separator)
Comment l’utiliser
SELECT value AS 'Flavor' FROM STRING_SPLIT('Chocolate,Vanilla,Strawberry', ',');
Résultats
Le plan
Voici à quoi ressemble le plan. Il est très direct et simple.
Fonction personnalisée
Voici maintenant une version maison que vous pouvez trouver dans certains environnements. Vous pouvez voir que son efficacité est bien moindre.
/****** Object: UserDefinedFunction . Script Date: 2/11/2020 6:26:45 PM ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOALTER FUNCTION .( @sInputList VARCHAR(8000) -- List of delimited items , @sDelimiter VARCHAR(8000) = ',' -- delimiter that separates items) RETURNS @List TABLE (item VARCHAR(8000))BEGINDECLARE @sItem VARCHAR(8000)WHILE CHARINDEX(@sDelimiter,@sInputList,0) <> 0 BEGIN SELECT @sItem=RTRIM(LTRIM(SUBSTRING(@sInputList,1,CHARINDEX(@sDelimiter,@sInputList,0)-1))), @sInputList=RTRIM(LTRIM(SUBSTRING(@sInputList,CHARINDEX(@sDelimiter,@sInputList,0)+LEN(@sDelimiter),LEN(@sInputList)))) IF LEN(@sItem) > 0 INSERT INTO @List SELECT @sItem ENDIF LEN(@sInputList) > 0 INSERT INTO @List SELECT @sInputList -- Put the last item inRETURNEND
Les résultats
Les résultats sont les mêmes. Mais notez que votre nom de champ sera le même à chaque fois, avec la nouvelle fonction vous obtenez un peu plus de flexibilité à ce sujet.
Le plan
Il est un peu plus compliqué que le direct que nous avons vu ci-dessus incluant une séquence.
Il existe de nombreuses façons différentes d’écrire une fonction de fractionnement pour que les choses fonctionnent, cependant, maintenant que SQL Server nous en a donné une, je vous encourage vivement à y jeter un œil. Lors de l’optimisation des performances, assurez-vous de jeter un coup d’œil à ce que vous avez toujours fait dans votre code et cherchez des moyens de l’améliorer comme celui-ci. Vous pouvez en savoir plus et voir plus d’exemples ici sur docs.microsoft.com.
Contacter l’auteur | Contacter DCAC