sql >> Databasteknik >  >> RDS >> Database

Flera sätt att infoga delade avgränsade strängar i en kolumn

I den här artikeln kommer jag att visa flera sätt att dela upp den avgränsade strängen och infoga den i en kolumn i en tabell i SQL Server. Du kan göra det med följande metoder:

  1. Konvertera avgränsad sträng till XML, använd XQuery för att dela strängen och spara den i tabellen.
  2. Skapa en användardefinierad funktion med tabellvärde för att dela strängen och infoga den i tabellen.
  3. Dela strängen med funktionen STRING_SPLIT och infoga utdata i en tabell.

För att demonstrera ovanstående metoder, låt mig förbereda en demo-inställning. Låt oss först skapa en tabell med namnet AnställdDemoDatabase . För att göra det måste vi köra följande fråga:

USE DEMODATABASE 
GO 

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

För denna demo kommer vi att infoga namnen på alla anställda på en rad och namnen på anställda kommer att separeras med ett kommatecken. För att göra det måste vi köra följande fråga:

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

Utför följande fråga för att verifiera att data har infogats i kolumnen.

SELECT * 
FROM   EMPLOYEE

Följande är utdata:

Som jag nämnde ovan kommer vi att dela upp den avgränsade strängen och infoga den i en tabell. Så vi skapar en tabell med namnet Employee_Detail för att lagra den avgränsade strängen delad med någon av ovanstående metoder.

För att skapa en tabell, kör följande kod:

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

Metod 1:Använd funktionen STRING_SPLIT för att dela upp den avgränsade strängen

Vi kommer att använda STRING_SPLIT funktion för att dela strängen i en kolumn och infoga den i en tabell. Innan vi gör det, låt mig förklara om STRING_SPLIT funktion.

Vad är STRING_SPLIT-funktionen

STRING_SPLIT är en tabellvärderad funktion, introducerad i SQL Server 2016. Denna funktion delar upp strängen baserat på specialtecknet i raden och returnerar utdata i en separat tabell. Vi kan använda den här funktionen på databaser som har kompatibilitetsnivå lika med eller högre än 130.

Funktionen STRING_SPLIT accepterar två parametrar och returnerar en tabell med de separerade värdena. Följande är syntaxen för funktionen STRING_SPLIT.

SELECT STRING_SPLIT (STRING, SPECIALCHARACTER)

I ovanstående syntax är SPECIALCHARACTER ett tecken som kommer att användas för att separera inmatningssträngen.

Följande är ett enkelt exempel på funktionen STRING_SPLIT.

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

Följande är en utdata från frågan:

Som du kan se i exemplet ovan returneras namnet på utdatakolumnen av STRING_SPLIT är "värde". Vi kan filtrera utdata som returneras av funktionen med hjälp av WHERE-satsen i kolumnen "värde" och också kan vi sortera utdataordningen med hjälp avORDER BY sats i kolumnen "värde".

Följande är ett exempel.

För att nu infoga en avgränsad sträng i en tabell kommer vi att utföra följande uppgifter:

  1. Skapa en variabel med namnet @EmployeeName , som innehåller utdata från anställd tabell. För att göra det, kör följande kod:
    DECLARE @EMPLOYEENAME VARCHAR(MAX) 
    SET @EMPLOYEENAME =(SELECT EMPLOYEE_NAME 
                        FROM   EMPLOYEE)
  2. Skapa en annan variabel som heter @Separator av char-datatypen. Denna variabel innehåller värdet på separatorn, som kommer att användas för att dela upp strängarna i flera värden. För att skapa variabeln och tilldela värdet till separatorn, kör följande kod:
    DECLARE @SEPARATOR CHAR(1) 
    SET @SEPARATOR=','
  3. Använd nu "STRING_SPLIT ”-funktionen för att dela upp värdena för anställd_namn kolumnen Anställd tabellen och infoga värdena i EMPLOYEENAME tabell. För att göra det, kör följande kod:
    INSERT INTO EMPLOYEE_DETAIL 
                (EMPNAME) 
    SELECT * 
    FROM   STRING_SPLIT(@EMPLOYEENAME, @SEPARATOR)

Följande är hela skriptet:

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)

Kör skriptet ovan. Skriptet kommer att infoga nio rader i tabellen. När du har kört det, se till att data har infogats i EMPLOYEENAME tabell. För detta, kör följande fråga:

SELECT * 
FROM   EMPLOYEE_DETAIL

Följande är utdata:

Metod 2:Dela sträng med XML och infoga utdata i tabellen

När vi vill dela upp den avgränsade strängen kan vi göra det med hjälp av tabellvärderade funktioner. Som vi vet är de användardefinierade tabellvärderade funktionerna resurskrävande och bör undvikas. I sådana fall har vi inte många alternativ tillgängliga. Som jag nämnde, STRING_SPLIT funktion kan användas för databaser som har en kompatibilitetsnivå som är större än eller lika med 130. Under sådana omständigheter är det svårt att hitta ett sätt att dela en avgränsad sträng. Vi har skapat en enkel och effektiv lösning för denna uppgift. Vi kan dela strängen med XML.

Så i det här avsnittet kommer jag att förklara koden för XML som kan användas för att infoga den delade avgränsade strängen i olika rader i en kolumn.

Jag har delat upp hela koden i tre steg.

Steg 1 :Konvertera den avgränsade strängen till XML-format. För att göra det, kör följande kod:

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

Följande är utdata:

För att se hela XML-strängen, klicka på cellen som visas på bilden ovan. När du klickar på cellen bör XML-filen se ut så här:

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

Steg 2 :När strängen har konverterats till XML, använd X-Query för att fråga XML-filen. För att göra det, kör följande kod:

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)

Följande är utdata:

Steg 3 :Infoga utdata som genereras av frågan som kördes ovan i Employee_Detail tabell. För att göra det, kör följande kod:

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

När data har infogats, kör följande skript för att verifiera att data har infogats. Kör följande fråga:

USE DEMODATABASE 
GO 
SELECT * 
FROM   EMPLOYEE_DETAIL

Följande är utgången.

Metod 3:Dela sträng med tabellvärderad funktion och infoga utdata från funktionen i tabellen

Detta tillvägagångssätt är traditionellt och stöds i alla versioner och utgåvor av SQL Server. I det här tillvägagångssättet kommer vi att skapa en användardefinierad tabellvärderad funktion som kommer att använda while loop och CHARINDEX och SUBSTRING funktionen.

Följande är koden för att skapa en 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

När funktionen har skapats, kör följande fråga för att dela upp frågan och infoga utdata iEmployee_Detail bord.

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

När data har infogats i tabellen, kör följande fråga för att verifiera att data har infogats korrekt

Sammanfattning

I den här artikeln har jag täckt:

  1. Annorlunda tillvägagångssätt för att dela och infoga den avgränsade strängen i tabellen.
  2. Hög nivå är sammanfattningen av funktionen STRING_SPLIT.
  3. Dela och infoga en avgränsad sträng med XML och XQuery.
  4. Dela och infoga avgränsad sträng med en användardefinierad funktion med tabellvärde.

  1. Min MySQL-trigger fungerar inte, enkel syntax, inte komplicerad

  2. Vad är ett index i SQL?

  3. Bästa tillvägagångssätt för grupperad median

  4. COUNT() Funktion i MariaDB