sql >> Database >  >> RDS >> Database

Verschillende manieren om gesplitste, gescheiden tekenreeksen in een kolom in te voegen

In dit artikel zal ik verschillende manieren demonstreren om de begrensde tekenreeks te splitsen en in te voegen in een kolom van een tabel in SQL Server. U kunt dit op de volgende manieren doen:

  1. Converteer de begrensde tekenreeks in XML, gebruik XQuery om de tekenreeks te splitsen en sla deze op in de tabel.
  2. Maak een door de gebruiker gedefinieerde tabelwaardefunctie om de tekenreeks te splitsen en in de tabel in te voegen.
  3. Split de string met de functie STRING_SPLIT en voeg de uitvoer in een tabel in.

Laat me een demo-opstelling voorbereiden om de bovenstaande methoden te demonstreren. Laten we eerst een tabel maken met de naam Werknemer op DemoDatabase . Om dat te doen, moeten we de volgende query uitvoeren:

USE DEMODATABASE 
GO 

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

Voor deze demo zullen we de namen van alle medewerkers in één rij invoegen en de namen van medewerkers worden gescheiden door een komma. Om dat te doen, moeten we de volgende query uitvoeren:

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

Voer de volgende query uit om te controleren of de gegevens in de kolom zijn ingevoegd.

SELECT * 
FROM   EMPLOYEE

Het volgende is de uitvoer:

Zoals ik hierboven al zei, gaan we de begrensde string splitsen en in een tabel invoegen. We zullen dus een tabel maken met de naam Employee_Detail om de gesplitste tekenreeks met een van de bovenstaande methoden op te slaan.

Voer de volgende code uit om een ​​tabel te maken:

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

Methode 1:gebruik de functie STRING_SPLIT om de gescheiden string te splitsen

We gebruiken de STRING_SPLIT functie om de tekenreeks in een kolom te splitsen en in een tabel in te voegen. Voordat we dat doen, wil ik u eerst uitleggen over de STRING_SPLIT functie.

Wat is de STRING_SPLIT-functie

STRING_SPLIT is een functie met tabelwaarde, geïntroduceerd in SQL Server 2016. Deze functie splitst de tekenreeks op basis van het speciale teken in de rij en retourneert de uitvoer in een aparte tabel. We kunnen deze functie gebruiken voor databases met een compatibiliteitsniveau gelijk aan of hoger dan 130.

De functie STRING_SPLIT accepteert twee parameters en retourneert een tabel met de gescheiden waarden. Het volgende is de syntaxis van de STRING_SPLIT-functie.

SELECT STRING_SPLIT (STRING, SPECIALCHARACTER)

In de bovenstaande syntaxis is SPECIALCHARACTER één teken dat wordt gebruikt om de invoerreeks te scheiden.

Het volgende is een eenvoudig voorbeeld van de STRING_SPLIT-functie.

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

Het volgende is een uitvoer van de vraag:

Zoals u in het bovenstaande voorbeeld kunt zien, wordt de naam van de uitvoerkolom geretourneerd door STRING_SPLIT is "waarde". We kunnen de uitvoer die door de functie wordt geretourneerd, filteren met behulp van de WHERE-component in de kolom "waarde" en we kunnen ook de volgorde van de uitvoer sorteren met behulp van de ORDER BY clausule in de kolom "waarde".

Het volgende is een voorbeeld.

Om nu een begrensde string in een tabel in te voegen, zullen we de volgende taken uitvoeren:

  1. Maak een variabele met de naam @EmployeeName , die de uitvoer bevat van de Werknemer tafel. Voer hiervoor de volgende code uit:
    DECLARE @EMPLOYEENAME VARCHAR(MAX) 
    SET @EMPLOYEENAME =(SELECT EMPLOYEE_NAME 
                        FROM   EMPLOYEE)
  2. Maak nog een variabele met de naam @Separator van het gegevenstype char. Deze variabele bevat de waarde van het scheidingsteken, dat zal worden gebruikt om de tekenreeksen in meerdere waarden te splitsen. Voer de volgende code uit om de variabele te maken en de waarde aan het scheidingsteken toe te kennen:
    DECLARE @SEPARATOR CHAR(1) 
    SET @SEPARATOR=','
  3. Gebruik nu de "STRING_SPLIT ” functie om de waarden van de employee_name . te splitsen kolom van de Medewerker tabel en voeg de waarden in de EMPLOYEENAME in tafel. Voer hiervoor de volgende code uit:
    INSERT INTO EMPLOYEE_DETAIL 
                (EMPNAME) 
    SELECT * 
    FROM   STRING_SPLIT(@EMPLOYEENAME, @SEPARATOR)

Het volgende is het hele script:

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)

Voer het bovenstaande script uit. Het script voegt negen rijen in de tabel in. Als je het eenmaal hebt uitgevoerd, zorg er dan voor dat de gegevens zijn ingevoegd in de EMPLOYEENAME tafel. Voer hiervoor de volgende query uit:

SELECT * 
FROM   EMPLOYEE_DETAIL

Het volgende is de uitvoer:

Methode 2:String splitsen met XML en de uitvoer in de tabel invoegen

Als we de begrensde tekenreeks willen splitsen, kunnen we dit doen met behulp van tabelwaardefuncties. Zoals we weten, zijn de door de gebruiker gedefinieerde tabelwaardefuncties arbeidsintensief en moeten ze worden vermeden. In dergelijke gevallen hebben we niet veel opties beschikbaar. Zoals ik al zei, de STRING_SPLIT functie kan worden gebruikt voor de databases met een compatibiliteitsniveau groter dan of gelijk aan 130. In dergelijke omstandigheden is het moeilijk om een ​​manier te vinden om een ​​gescheiden string te splitsen. We hebben een eenvoudige en efficiënte oplossing voor deze taak gemaakt. We kunnen de string splitsen met XML.

Dus in deze sectie ga ik de code van XML uitleggen die kan worden gebruikt om de gesplitste begrensde tekenreeks in verschillende rijen van een kolom in te voegen.

Ik heb de hele code in drie stappen opgesplitst.

Stap 1 :converteer de begrensde tekenreeks naar de XML-indeling. Voer hiervoor de volgende code uit:

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

Het volgende is de uitvoer:

Om de volledige XML-tekenreeks te bekijken, klikt u op de cel zoals weergegeven in de afbeelding hierboven. Zodra u op de cel klikt, ziet het XML-bestand er als volgt uit:

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

Stap 2 :Zodra de tekenreeks is geconverteerd naar XML, gebruikt u X-Query om het XML-bestand te doorzoeken. Voer hiervoor de volgende code uit:

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)

Het volgende is de uitvoer:

Stap 3 :voeg de uitvoer in die is gegenereerd door de hierboven uitgevoerde query in de Employee_Detail tafel. Voer hiervoor de volgende code uit:

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

Nadat de gegevens zijn ingevoegd, voert u het volgende script uit om te controleren of de gegevens zijn ingevoegd. Voer de volgende vraag uit:

USE DEMODATABASE 
GO 
SELECT * 
FROM   EMPLOYEE_DETAIL

Het volgende is de uitvoer.

Methode 3:Splits string met behulp van tabelwaardefunctie en voeg de uitvoer van de functie in de tabel in

Deze aanpak is traditioneel en wordt ondersteund in alle versies en edities van SQL Server. In deze benadering zullen we een door de gebruiker gedefinieerde tabelwaardefunctie maken die de while-lus en de CHARINDEX- en SUBSTRING-functie zal gebruiken.

Het volgende is de code om een ​​functie te maken:

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

Nadat de functie is gemaakt, voert u de volgende query uit om de query te splitsen en de uitvoer in te voegen in de Employee_Detail tafel.

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

Nadat de gegevens in de tabel zijn ingevoegd, voert u de volgende query uit om te controleren of de gegevens correct zijn ingevoegd

Samenvatting

In dit artikel heb ik het volgende behandeld:

  1. Andere benadering voor het splitsen en invoegen van de gescheiden tekenreeks in de tabel.
  2. Hoog niveau is een samenvatting van de STRING_SPLIT-functie.
  3. Split en voeg een gescheiden tekenreeks in met XML en XQuery.
  4. Gescheiden tekenreeks splitsen en invoegen met behulp van een door de gebruiker gedefinieerde tabelwaardefunctie.

  1. Converteer varchar naar datetime in SQL Server

  2. Configuratie met hoge beschikbaarheid voor ClusterControl-knooppunten met behulp van CMON HA

  3. Exporteer Postgresql-tabelgegevens met pgAdmin

  4. Geheugendruk Analyse Risicostatus