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:
- Konverter afgrænset streng til XML, brug XQuery til at opdele strengen, og gem den i tabellen.
- Opret en brugerdefineret funktion med tabelværdi for at opdele strengen og indsætte den i tabellen.
- 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 Medarbejder på DemoDatabase . 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:
- 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)
- 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=','
- 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:
- Anden tilgang til at opdele og indsætte den afgrænsede streng i tabel.
- Højt niveau er en oversigt over funktionen STRING_SPLIT.
- Opdel og indsæt en separeret streng ved hjælp af XML og XQuery.
- Opdel og indsæt afgrænset streng ved hjælp af en brugerdefineret funktion med tabelværdi.