Dans cet article, je vais montrer plusieurs façons de diviser la chaîne délimitée et de l'insérer dans une colonne d'une table dans SQL Server. Vous pouvez le faire en utilisant les méthodes suivantes :
- Convertissez une chaîne délimitée en XML, utilisez XQuery pour diviser la chaîne et enregistrez-la dans la table.
- Créez une fonction table définie par l'utilisateur pour diviser la chaîne et l'insérer dans la table.
- Divisez la chaîne à l'aide de la fonction STRING_SPLIT et insérez la sortie dans un tableau.
Pour démontrer les méthodes ci-dessus, permettez-moi de préparer une configuration de démonstration. Tout d'abord, créons une table nommée Employee sur DemoDatabase . Pour ce faire, nous devons exécuter la requête suivante :
USE DEMODATABASE GO CREATE TABLE EMPLOYEE ( ID INT IDENTITY (1, 1), EMPLOYEE_NAME VARCHAR(MAX) )
Pour cette démo, nous allons insérer les noms de tous les employés sur une seule ligne et les noms des employés seront séparés par une virgule. Pour ce faire, nous devons exécuter la requête suivante :
INSERT INTO EMPLOYEE (EMPLOYEE_NAME) VALUES ('DULCE , MARA , PHILIP , KATHLEEN, NEREIDA , GASTON , ETTA , EARLEAN , VINCENZA')
Exécutez la requête suivante pour vérifier que les données ont été insérées dans la colonne.
SELECT * FROM EMPLOYEE
Voici le résultat :
Comme je l'ai mentionné ci-dessus, nous allons diviser la chaîne délimitée et l'insérer dans une table. Nous allons donc créer une table nommée Employee_Detail pour stocker la chaîne délimitée divisée par l'une des méthodes ci-dessus.
Pour créer une table, exécutez le code suivant :
USE DEMODATABASE GO CREATE TABLE EMPLOYEE_DETAIL ( ID INT IDENTITY(1, 1) PRIMARY KEY CLUSTERED, EMPNAME VARCHAR(MAX) NOT NULL )
Méthode 1 :Utiliser la fonction STRING_SPLIT pour diviser la chaîne délimitée
Nous utiliserons le STRING_SPLIT fonction pour diviser la chaîne dans une colonne et l'insérer dans une table. Avant de faire cela, permettez-moi de vous expliquer le STRING_SPLIT fonction.
Qu'est-ce que la fonction STRING_SPLIT
STRING_SPLIT est une fonction table, introduite dans SQL Server 2016. Cette fonction divise la chaîne en fonction du caractère spécial dans la ligne et renvoie la sortie dans une table séparée. Nous pouvons utiliser cette fonction sur les bases de données qui ont un niveau de compatibilité égal ou supérieur à 130.
La fonction STRING_SPLIT accepte deux paramètres et renvoie un tableau avec les valeurs séparées. Voici la syntaxe de la fonction STRING_SPLIT.
SELECT STRING_SPLIT (STRING, SPECIALCHARACTER)
Dans la syntaxe ci-dessus, SPECIALCHARACTER est un caractère qui sera utilisé pour séparer la chaîne d'entrée.
Voici un exemple simple de la fonction STRING_SPLIT.
DECLARE @STRING VARCHAR(MAX) DECLARE @SPECIALCHARACTER CHAR(1) SET @STRING='NISARG,NIRALI,RAMESH,SURESH' SELECT * FROM STRING_SPLIT (@STRING, ',')
Voici un résultat de la requête :
Comme vous pouvez le voir dans l'exemple ci-dessus, le nom de la colonne de sortie renvoyé par STRING_SPLIT est « valeur ». Nous pouvons filtrer la sortie renvoyée par la fonction en utilisant la clause WHERE sur la colonne "valeur" et aussi, nous pouvons trier l'ordre de sortie en utilisant la ORDER BY clause sur la colonne "valeur".
Voici un exemple.
Maintenant, pour insérer une chaîne délimitée dans un tableau, nous allons effectuer les tâches suivantes :
- Créez une variable nommée @EmployeeName , qui contient la sortie de l'Employé table. Pour ce faire, exécutez le code suivant :
DECLARE @EMPLOYEENAME VARCHAR(MAX) SET @EMPLOYEENAME =(SELECT EMPLOYEE_NAME FROM EMPLOYEE)
- Créez une autre variable appelée @Separator du type de données char. Cette variable contient la valeur du séparateur, qui sera utilisé pour diviser les chaînes en plusieurs valeurs. Pour créer la variable et affecter la valeur au séparateur, exécutez le code suivant :
DECLARE @SEPARATOR CHAR(1) SET @SEPARATOR=','
- Utilisez maintenant le "STRING_SPLIT ” pour diviser les valeurs de employee_name colonne de l'Employé table et insérez les valeurs dans EMPLOYEENAME table. Pour ce faire, exécutez le code suivant :
INSERT INTO EMPLOYEE_DETAIL (EMPNAME) SELECT * FROM STRING_SPLIT(@EMPLOYEENAME, @SEPARATOR)
Voici le script complet :
DECLARE @EMPLOYEENAME VARCHAR(MAX) SET @EMPLOYEENAME =(SELECT EMPLOYEE_NAME FROM EMPLOYEE) DECLARE @SEPARATOR CHAR(1) SET @SEPARATOR=',' INSERT INTO EMPLOYEE_DETAIL (EMPNAME) SELECT * FROM STRING_SPLIT(@EMPLOYEENAME, @SEPARATOR)
Exécutez le script ci-dessus. Le script insère neuf lignes dans le tableau. Une fois que vous l'exécutez, assurez-vous que les données ont été insérées dans le EMPLOYEENAME table. Pour cela, exécutez la requête suivante :
SELECT * FROM EMPLOYEE_DETAIL
Voici le résultat :
Méthode 2 :fractionner la chaîne à l'aide de XML et insérer la sortie dans le tableau
Lorsque nous voulons diviser la chaîne délimitée, nous pouvons le faire en utilisant des fonctions table. Comme nous le savons, les fonctions table définies par l'utilisateur sont gourmandes en ressources et doivent être évitées. Dans de tels cas, nous n'avons pas beaucoup d'options disponibles. Comme je l'ai mentionné, le STRING_SPLIT La fonction peut être utilisée pour les bases de données qui ont un niveau de compatibilité supérieur ou égal à 130. Dans de telles circonstances, il est difficile de trouver un moyen de diviser une chaîne délimitée. Nous avons créé une solution simple et efficace pour cette tâche. Nous pouvons diviser la chaîne en utilisant XML.
Donc, dans cette section, je vais expliquer le code XML qui peut être utilisé pour insérer la chaîne délimitée divisée dans différentes lignes d'une colonne.
J'ai divisé l'intégralité du code en trois étapes.
Étape 1 :convertit la chaîne délimitée au format XML. Pour cela, exécutez le code suivant :
USE demodatabase go DECLARE @xml AS XML, @QueryData AS VARCHAR(max), @delimiter AS VARCHAR(10) SET @QueryData=(SELECT employee_name FROM employee) SET @delimiter =',' SET @xml = Cast(( '<EMPNAME>' + Replace(@QueryData, @delimiter, '</EMPNAME><EMPNAME>') + '</EMPNAME>' ) AS XML) SELECT @XML
Voici le résultat :
Pour afficher la chaîne XML entière, cliquez sur la cellule comme indiqué sur l'image ci-dessus. Une fois que vous avez cliqué sur la cellule, le fichier XML devrait ressembler à ceci :
<EMPNAME>DULCE </EMPNAME> <EMPNAME> MARA </EMPNAME> <EMPNAME> PHILIP </EMPNAME> <EMPNAME> KATHLEEN</EMPNAME> <EMPNAME> NEREIDA </EMPNAME> <EMPNAME> GASTON </EMPNAME> <EMPNAME> ETTA </EMPNAME> <EMPNAME> EARLEAN </EMPNAME> <EMPNAME> VINCENZA</EMPNAME>
Étape 2 :Une fois la chaîne convertie en XML, utilisez X-Query pour interroger le fichier XML. Pour cela, exécutez le code suivant :
USE DEMODATABASE GO DECLARE @XML AS XML, @STR AS VARCHAR(MAX), @DELIMITER AS VARCHAR(10) SET @STR=(SELECT EMPLOYEE_NAME FROM EMPLOYEE) SET @DELIMITER =',' SET @XML = CAST(( '<EMPNAME>' + REPLACE(@STR, @DELIMITER, '</EMPNAME><EMPNAME>') + '</EMPNAME>' ) AS XML) SELECT N.VALUE('.', 'VARCHAR(10)') AS VALUE FROM @XML.NODES('EMPNAME') AS T(N)
Voici le résultat :
Étape 3 :Insérez la sortie générée par la requête exécutée ci-dessus dans le Employee_Detail table. Pour cela, exécutez le code suivant :
USE DEMODATABASE GO DECLARE @XML AS XML,@STR AS VARCHAR(MAX),@DELIMITER AS VARCHAR(10) SET @STR=(SELECT EMPLOYEE_NAME FROM EMPLOYEE) SET @DELIMITER =',' SET @XML = CAST(('<EMPNAME>'+REPLACE(@STR,@DELIMITER ,'</EMPNAME><EMPNAME>')+'</EMPNAME>') AS XML) INSERT INTO EMPLOYEE_DETAIL (EMPNAME) SELECT N.VALUE('.', 'VARCHAR(10)') AS VALUE FROM @XML.NODES('EMPNAME') AS T(N) /*Output (9 rows affected) */
Une fois les données insérées, exécutez le script suivant pour vérifier que les données ont été insérées. Exécutez la requête suivante :
USE DEMODATABASE GO SELECT * FROM EMPLOYEE_DETAIL
Voici la sortie.
Méthode 3 :Fractionner une chaîne à l'aide d'une fonction table et insérer la sortie de la fonction dans la table
Cette approche est traditionnelle et est prise en charge dans toutes les versions et éditions de SQL Server. Dans cette approche, nous allons créer une fonction table définie par l'utilisateur qui utilisera la boucle while et les fonctions CHARINDEX et SUBSTRING.
Voici le code pour créer une fonction :
REATE FUNCTION [DBO].SPLIT_DELIMITED_STRING (@SQLQUERY VARCHAR(MAX), @DELIMITOR CHAR(1)) RETURNS @RESULT TABLE( VALUE VARCHAR(MAX)) AS BEGIN DECLARE @DELIMITORPOSITION INT = CHARINDEX(@DELIMITOR, @SQLQUERY), @VALUE VARCHAR(MAX), @STARTPOSITION INT = 1 IF @DELIMITORPOSITION = 0 BEGIN INSERT INTO @RESULT VALUES (@SQLQUERY) RETURN END SET @SQLQUERY = @SQLQUERY + @DELIMITOR WHILE @DELIMITORPOSITION > 0 BEGIN SET @VALUE = SUBSTRING(@SQLQUERY, @STARTPOSITION, @DELIMITORPOSITION - @STARTPOSITION) IF( @VALUE <> '' ) INSERT INTO @RESULT VALUES (@VALUE) SET @STARTPOSITION = @DELIMITORPOSITION + 1 SET @DELIMITORPOSITION = CHARINDEX(@DELIMITOR, @SQLQUERY, @STARTPOSITION) END RETURN END
Une fois la fonction créée, exécutez la requête suivante pour diviser la requête et insérer la sortie dans le Employee_Detail tableau.
DECLARE @SQLQUERY NVARCHAR(MAX) SET @SQLQUERY=(SELECT EMPLOYEE_NAME FROM EMPLOYEE) INSERT INTO EMPLOYEE_DETAIL SELECT * FROM SPLIT_DELIMITED_STRING(@SQLQUERY, ',')
Une fois les données insérées dans le tableau, exécutez la requête suivante pour vérifier que les données ont été correctement insérées
Résumé
Dans cet article, j'ai couvert :
- Approche différente pour diviser et insérer la chaîne délimitée dans le tableau.
- Le niveau supérieur est un résumé de la fonction STRING_SPLIT.
- Divisez et insérez une chaîne délimitée à l'aide de XML et XQuery.
- Divisez et insérez une chaîne délimitée à l'aide d'une fonction table définie par l'utilisateur.