Database
 sql >> Datenbank >  >> RDS >> Database

Mehrere Möglichkeiten zum Einfügen von geteilten getrennten Zeichenfolgen in eine Spalte

In diesem Artikel zeige ich verschiedene Möglichkeiten, die Zeichenfolge mit Trennzeichen aufzuteilen und sie in eine Spalte einer Tabelle in SQL Server einzufügen. Sie können dies mit den folgenden Methoden tun:

  1. Konvertieren Sie eine Zeichenfolge mit Trennzeichen in XML, verwenden Sie XQuery, um die Zeichenfolge aufzuteilen, und speichern Sie sie in der Tabelle.
  2. Erstellen Sie eine benutzerdefinierte Tabellenwertfunktion, um die Zeichenfolge aufzuteilen und in die Tabelle einzufügen.
  3. Teilen Sie den String mit der Funktion STRING_SPLIT und fügen Sie die Ausgabe in eine Tabelle ein.

Lassen Sie mich ein Demo-Setup vorbereiten, um die oben genannten Methoden zu demonstrieren. Lassen Sie uns zunächst eine Tabelle mit dem Namen Employee erstellen auf DemoDatabase . Dazu müssen wir die folgende Abfrage ausführen:

USE DEMODATABASE 
GO 

CREATE TABLE EMPLOYEE 
  ( 
     ID            INT IDENTITY (1, 1), 
     EMPLOYEE_NAME VARCHAR(MAX) 
  )

Für diese Demo werden wir die Namen aller Mitarbeiter in einer Zeile einfügen und die Namen der Mitarbeiter werden durch ein Komma getrennt. Dazu müssen wir die folgende Abfrage ausführen:

INSERT INTO EMPLOYEE 
            (EMPLOYEE_NAME) 
VALUES      ('DULCE , MARA , PHILIP , KATHLEEN, NEREIDA , GASTON , ETTA , EARLEAN , VINCENZA')

Führen Sie die folgende Abfrage aus, um zu überprüfen, ob Daten in die Spalte eingefügt wurden.

SELECT * 
FROM   EMPLOYEE

Das Folgende ist die Ausgabe:

Wie ich oben erwähnt habe, teilen wir die Zeichenfolge mit Trennzeichen auf und fügen sie in eine Tabelle ein. Also erstellen wir eine Tabelle mit dem Namen Employee_Detail um die getrennte Zeichenfolge mit einer der oben genannten Methoden zu speichern.

Um eine Tabelle zu erstellen, führen Sie den folgenden Code aus:

USE DEMODATABASE 
GO 
CREATE TABLE EMPLOYEE_DETAIL 
  ( 
     ID      INT IDENTITY(1, 1) PRIMARY KEY CLUSTERED, 
     EMPNAME VARCHAR(MAX) NOT NULL 
  )

Methode 1:Verwenden Sie die Funktion STRING_SPLIT, um die Zeichenfolge mit Trennzeichen aufzuteilen

Wir werden den STRING_SPLIT verwenden Funktion, um die Zeichenfolge in einer Spalte aufzuteilen und in eine Tabelle einzufügen. Bevor wir das tun, lassen Sie mich den STRING_SPLIT erläutern Funktion.

Was ist die STRING_SPLIT-Funktion

STRING_SPLIT ist eine Tabellenwertfunktion, die in SQL Server 2016 eingeführt wurde. Diese Funktion teilt die Zeichenfolge basierend auf dem Sonderzeichen innerhalb der Zeile und gibt die Ausgabe in einer separaten Tabelle zurück. Wir können diese Funktion für Datenbanken mit einem Kompatibilitätsgrad von mindestens 130 verwenden.

Die Funktion STRING_SPLIT akzeptiert zwei Parameter und gibt eine Tabelle mit den getrennten Werten zurück. Das Folgende ist die Syntax der STRING_SPLIT-Funktion.

SELECT STRING_SPLIT (STRING, SPECIALCHARACTER)

In der obigen Syntax ist SPECIALCHARACTER ein Zeichen, das verwendet wird, um die Eingabezeichenfolge zu trennen.

Das Folgende ist ein einfaches Beispiel der STRING_SPLIT-Funktion.

DECLARE @STRING VARCHAR(MAX) 
DECLARE @SPECIALCHARACTER CHAR(1) 
SET @STRING='NISARG,NIRALI,RAMESH,SURESH' 
SELECT * 
FROM   STRING_SPLIT (@STRING, ',')

Das Folgende ist eine Ausgabe der Abfrage:

Wie Sie im obigen Beispiel sehen können, wird der Name der Ausgabespalte von STRING_SPLIT zurückgegeben ist „Wert“. Wir können die von der Funktion zurückgegebene Ausgabe mithilfe der WHERE-Klausel in der Spalte „Wert“ filtern und außerdem die Reihenfolge der Ausgabe mithilfe von ORDER BY sortieren -Klausel in der Spalte „Wert“.

Das Folgende ist ein Beispiel.

Um nun eine Zeichenfolge mit Trennzeichen in eine Tabelle einzufügen, führen wir die folgenden Aufgaben aus:

  1. Erstellen Sie eine Variable namens @EmployeeName , die die Ausgabe des Employee enthält Tisch. Führen Sie dazu den folgenden Code aus:
    DECLARE @EMPLOYEENAME VARCHAR(MAX) 
    SET @EMPLOYEENAME =(SELECT EMPLOYEE_NAME 
                        FROM   EMPLOYEE)
  2. Erstellen Sie eine weitere Variable namens @Separator vom Datentyp char. Diese Variable enthält den Wert des Trennzeichens, das verwendet wird, um die Zeichenfolgen in mehrere Werte aufzuteilen. Um die Variable zu erstellen und dem Trennzeichen den Wert zuzuweisen, führen Sie den folgenden Code aus:
    DECLARE @SEPARATOR CHAR(1) 
    SET @SEPARATOR=','
  3. Verwenden Sie jetzt den „STRING_SPLIT ”-Funktion, um die Werte von employee_name aufzuteilen Spalte Mitarbeiter Tabelle und fügen Sie die Werte in EMPLOYEENAME ein Tisch. Führen Sie dazu den folgenden Code aus:
    INSERT INTO EMPLOYEE_DETAIL 
                (EMPNAME) 
    SELECT * 
    FROM   STRING_SPLIT(@EMPLOYEENAME, @SEPARATOR)

Das Folgende ist das gesamte Skript:

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)

Führen Sie das obige Skript aus. Das Skript fügt neun Zeilen in die Tabelle ein. Stellen Sie nach der Ausführung sicher, dass die Daten in EMPLOYEENAME eingefügt wurden Tisch. Führen Sie dazu die folgende Abfrage aus:

SELECT * 
FROM   EMPLOYEE_DETAIL

Das Folgende ist die Ausgabe:

Methode 2:String mit XML aufteilen und die Ausgabe in die Tabelle einfügen

Wenn wir die durch Trennzeichen getrennte Zeichenfolge aufteilen möchten, können wir dies mithilfe von Tabellenwertfunktionen tun. Wie wir wissen, sind die benutzerdefinierten Tabellenwertfunktionen ressourcenintensiv und sollten vermieden werden. In solchen Fällen haben wir nicht viele Optionen zur Verfügung. Wie ich bereits erwähnt habe, der STRING_SPLIT Die Funktion kann für Datenbanken mit einem Kompatibilitätsgrad größer oder gleich 130 verwendet werden. Unter solchen Umständen ist es schwierig, einen Weg zu finden, eine Zeichenfolge mit Trennzeichen aufzuteilen. Für diese Aufgabe haben wir eine einfache und effiziente Lösung geschaffen. Wir können den String mit XML aufteilen.

In diesem Abschnitt werde ich also den XML-Code erklären, der verwendet werden kann, um die geteilte Zeichenfolge mit Trennzeichen in verschiedene Zeilen einer Spalte einzufügen.

Ich habe den gesamten Code in drei Schritte aufgeteilt.

Schritt 1 :Konvertieren Sie die Zeichenfolge mit Trennzeichen in das XML-Format. Führen Sie dazu den folgenden Code aus:

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

Das Folgende ist die Ausgabe:

Um die gesamte XML-Zeichenfolge anzuzeigen, klicken Sie auf die Zelle, wie im Bild oben gezeigt. Nachdem Sie auf die Zelle geklickt haben, sollte die XML-Datei wie folgt aussehen:

<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>

Schritt 2 :Nachdem die Zeichenfolge in XML konvertiert wurde, verwenden Sie X-Query, um die XML-Datei abzufragen. Führen Sie dazu den folgenden Code aus:

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)

Das Folgende ist die Ausgabe:

Schritt 3 :Fügen Sie die von der oben ausgeführten Abfrage generierte Ausgabe in Employee_Detail ein Tisch. Führen Sie dazu den folgenden Code aus:

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)
 */

Führen Sie nach dem Einfügen der Daten das folgende Skript aus, um zu überprüfen, ob die Daten eingefügt wurden. Führen Sie die folgende Abfrage aus:

USE DEMODATABASE 
GO 
SELECT * 
FROM   EMPLOYEE_DETAIL

Das Folgende ist die Ausgabe.

Methode 3:String unter Verwendung einer Tabellenwertfunktion teilen und die Ausgabe der Funktion in die Tabelle einfügen

Dieser Ansatz ist traditionell und wird in allen Versionen und Editionen von SQL Server unterstützt. Bei diesem Ansatz erstellen wir eine benutzerdefinierte Tabellenwertfunktion, die eine While-Schleife und die Funktionen CHARINDEX und SUBSTRING verwendet.

Das Folgende ist der Code zum Erstellen einer Funktion:

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

Führen Sie nach dem Erstellen der Funktion die folgende Abfrage aus, um die Abfrage aufzuteilen und die Ausgabe in Employee_Detail einzufügen Tabelle.

DECLARE @SQLQUERY NVARCHAR(MAX) 
SET @SQLQUERY=(SELECT EMPLOYEE_NAME 
               FROM   EMPLOYEE) 
INSERT INTO EMPLOYEE_DETAIL 
SELECT * 
FROM   SPLIT_DELIMITED_STRING(@SQLQUERY, ',')

Führen Sie nach dem Einfügen von Daten in die Tabelle die folgende Abfrage aus, um zu überprüfen, ob die Daten richtig eingefügt wurden

Zusammenfassung

In diesem Artikel habe ich behandelt:

  1. Anderer Ansatz zum Aufteilen und Einfügen der Zeichenfolge mit Trennzeichen in die Tabelle.
  2. High-Level ist eine Zusammenfassung der STRING_SPLIT-Funktion.
  3. Aufteilen und Einfügen einer Zeichenfolge mit Trennzeichen mithilfe von XML und XQuery.
  4. Teilen Sie eine Zeichenfolge mit Trennzeichen auf und fügen Sie sie mithilfe einer benutzerdefinierten Tabellenwertfunktion ein.