Database
 sql >> Base de données >  >> RDS >> Database

Plusieurs façons d'insérer des chaînes délimitées fractionnées dans une colonne

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 :

  1. Convertissez une chaîne délimitée en XML, utilisez XQuery pour diviser la chaîne et enregistrez-la dans la table.
  2. Créez une fonction table définie par l'utilisateur pour diviser la chaîne et l'insérer dans la table.
  3. 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 :

  1. 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)
  2. 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=','
  3. 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 :

  1. Approche différente pour diviser et insérer la chaîne délimitée dans le tableau.
  2. Le niveau supérieur est un résumé de la fonction STRING_SPLIT.
  3. Divisez et insérez une chaîne délimitée à l'aide de XML et XQuery.
  4. Divisez et insérez une chaîne délimitée à l'aide d'une fonction table définie par l'utilisateur.