sql >> Database teknologi >  >> RDS >> Database

Flere måder at indsætte opdelte afgrænsede strenge i en kolonne

I denne artikel vil jeg demonstrere flere måder at opdele den afgrænsede streng og indsætte den i en kolonne i en tabel i SQL Server. Du kan gøre det ved at bruge følgende metoder:

  1. Konverter afgrænset streng til XML, brug XQuery til at opdele strengen, og gem den i tabellen.
  2. Opret en brugerdefineret funktion med tabelværdi for at opdele strengen og indsætte den i tabellen.
  3. Opdel strengen med funktionen STRING_SPLIT, og indsæt outputtet i en tabel.

For at demonstrere ovenstående metoder, lad mig forberede en demo-opsætning. Lad os først oprette en tabel med navnet MedarbejderDemoDatabase . For at gøre det skal vi udføre følgende forespørgsel:

USE DEMODATABASE 
GO 

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

Til denne demo vil vi indsætte navnene på alle medarbejdere i én række, og navnene på medarbejdere vil blive adskilt af et komma. For at gøre det skal vi udføre følgende forespørgsel:

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

Udfør følgende forespørgsel for at bekræfte, at data er blevet indsat i kolonnen.

SELECT * 
FROM   EMPLOYEE

Følgende er output:

Som jeg nævnte ovenfor, vil vi dele den afgrænsede streng og indsætte den i en tabel. Så vi vil oprette en tabel med navnet Employee_Detail for at gemme den afgrænsede streng opdelt ved hjælp af en af ​​ovenstående metoder.

For at oprette en tabel skal du udføre følgende kode:

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

Metode 1:Brug STRING_SPLIT-funktionen til at opdele den adskilte streng

Vi bruger STRING_SPLIT funktion til at opdele strengen i en kolonne og indsætte den i en tabel. Inden vi gør det, lad mig forklare om STRING_SPLIT funktion.

Hvad er STRING_SPLIT-funktionen

STRING_SPLIT er en funktion med tabelværdi, introduceret i SQL Server 2016. Denne funktion opdeler strengen baseret på specialtegnet i rækken og returnerer outputtet i en separat tabel. Vi kan bruge denne funktion på databaser, der har kompatibilitetsniveau lig med eller højere end 130.

Funktionen STRING_SPLIT accepterer to parametre og returnerer en tabel med de adskilte værdier. Det følgende er syntaksen for funktionen STRING_SPLIT.

SELECT STRING_SPLIT (STRING, SPECIALCHARACTER)

I ovenstående syntaks er SPECIALCHARACTER ét tegn, som vil blive brugt til at adskille inputstrengen.

Det følgende er et simpelt eksempel på funktionen STRING_SPLIT.

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

Følgende er et output af forespørgslen:

Som du kan se i ovenstående eksempel, returneres navnet på outputkolonnen af STRING_SPLIT er "værdi". Vi kan filtrere outputtet, der returneres af funktionen ved hjælp af WHERE-sætningen i "værdi"-kolonnen, og vi kan også sortere outputrækkefølgen ved hjælp afORDER BY klausul i kolonnen "værdi".

Det følgende er et eksempel.

For nu at indsætte en afgrænset streng i en tabel, udfører vi følgende opgaver:

  1. Opret en variabel med navnet @EmployeeName , som indeholder output fra medarbejderen bord. For at gøre det skal du udføre følgende kode:
    DECLARE @EMPLOYEENAME VARCHAR(MAX) 
    SET @EMPLOYEENAME =(SELECT EMPLOYEE_NAME 
                        FROM   EMPLOYEE)
  2. Opret en anden variabel kaldet @Separator af char-datatypen. Denne variabel indeholder værdien af ​​separatoren, som vil blive brugt til at opdele strengene i flere værdier. For at oprette variablen og tildele værdien til separatoren skal du udføre følgende kode:
    DECLARE @SEPARATOR CHAR(1) 
    SET @SEPARATOR=','
  3. Brug nu "STRING_SPLIT ” funktion til at opdele værdierne for medarbejdernavn kolonne i Medarbejder tabellen og indsæt værdierne i EMPLOYEENAME bord. For at gøre det skal du udføre følgende kode:
    INSERT INTO EMPLOYEE_DETAIL 
                (EMPNAME) 
    SELECT * 
    FROM   STRING_SPLIT(@EMPLOYEENAME, @SEPARATOR)

Følgende er hele scriptet:

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)

Udfør ovenstående script. Scriptet vil indsætte ni rækker i tabellen. Når du har udført det, skal du sørge for, at dataene er blevet indsat i EMPLOYEENAME bord. Til dette skal du udføre følgende forespørgsel:

SELECT * 
FROM   EMPLOYEE_DETAIL

Følgende er output:

Metode 2:Opdel streng ved hjælp af XML og indsæt output i tabellen

Når vi ønsker at opdele den afgrænsede streng, kan vi gøre det ved hjælp af tabelværdierede funktioner. Som vi ved, er de brugerdefinerede tabelværdierede funktioner ressourcekrævende og bør undgås. I sådanne tilfælde har vi ikke mange muligheder. Som jeg nævnte, er STRING_SPLIT funktion kan bruges til databaser, som har et kompatibilitetsniveau større end eller lig med 130. Under sådanne omstændigheder er det vanskeligt at finde en måde at opdele en afgrænset streng. Vi har skabt en enkel og effektiv løsning til denne opgave. Vi kan opdele strengen ved hjælp af XML.

Så i dette afsnit vil jeg forklare koden for XML, som kan bruges til at indsætte den opdelte afgrænsede streng i forskellige rækker i en kolonne.

Jeg har opdelt hele koden i tre trin.

Trin 1 :Konverter den afgrænsede streng til XML-formatet. For at gøre det skal du udføre følgende kode:

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ølgende er output:

For at se hele XML-strengen skal du klikke på cellen som vist på billedet ovenfor. Når du klikker på cellen, skal XML-filen se sådan ud:

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

Trin 2 :Når strengen er konverteret til XML, skal du bruge X-Query til at forespørge XML-filen. For at gøre det skal du udføre følgende kode:

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ølgende er output:

Trin 3 :Indsæt output genereret af forespørgslen udført ovenfor i Employee_Detail bord. For at gøre det skal du udføre følgende kode:

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 er indsat, skal du udføre følgende script for at bekræfte, at dataene er blevet indsat. Udfør følgende forespørgsel:

USE DEMODATABASE 
GO 
SELECT * 
FROM   EMPLOYEE_DETAIL

Følgende er outputtet.

Metode 3:Opdel streng ved hjælp af tabelværdi-funktion og indsæt output fra funktionen i tabellen

Denne tilgang er traditionel og understøttes i alle versioner og udgaver af SQL Server. I denne tilgang vil vi oprette en brugerdefineret tabelværdi-funktion, som vil bruge while-løkke og CHARINDEX- og SUBSTRING-funktionen.

Følgende er koden til at oprette 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 er oprettet, skal du udføre følgende forespørgsel for at opdele forespørgslen og indsætte outputtet imedarbejderdetalje tabel.

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

Når data er indsat i tabellen, skal du udføre følgende forespørgsel for at bekræfte, at data er blevet indsat korrekt

Oversigt

I denne artikel har jeg dækket:

  1. Anden tilgang til at opdele og indsætte den afgrænsede streng i tabel.
  2. Højt niveau er en oversigt over funktionen STRING_SPLIT.
  3. Opdel og indsæt en separeret streng ved hjælp af XML og XQuery.
  4. Opdel og indsæt afgrænset streng ved hjælp af en brugerdefineret funktion med tabelværdi.

  1. Foreign Key SQL:Alt hvad du behøver at vide om udenlandske nøgleoperationer

  2. Dynamisk SQL - EXEC(@SQL) versus EXEC SP_EXECUTESQL(@SQL)

  3. Oracle-lagret procedure:returner både resultatsæt og ud-parametre

  4. Indsæt i en MySQL-tabel eller opdater, hvis den findes