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:
- Konvertera avgränsad sträng till XML, använd XQuery för att dela strängen och spara den i tabellen.
- Skapa en användardefinierad funktion med tabellvärde för att dela strängen och infoga den i tabellen.
- 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älld på DemoDatabase . 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:
- 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)
- 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=','
- 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:
- Annorlunda tillvägagångssätt för att dela och infoga den avgränsade strängen i tabellen.
- Hög nivå är sammanfattningen av funktionen STRING_SPLIT.
- Dela och infoga en avgränsad sträng med XML och XQuery.
- Dela och infoga avgränsad sträng med en användardefinierad funktion med tabellvärde.