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:
- Converteer de begrensde tekenreeks in XML, gebruik XQuery om de tekenreeks te splitsen en sla deze op in de tabel.
- Maak een door de gebruiker gedefinieerde tabelwaardefunctie om de tekenreeks te splitsen en in de tabel in te voegen.
- 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:
- 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)
- 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=','
- 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:
- Andere benadering voor het splitsen en invoegen van de gescheiden tekenreeks in de tabel.
- Hoog niveau is een samenvatting van de STRING_SPLIT-functie.
- Split en voeg een gescheiden tekenreeks in met XML en XQuery.
- Gescheiden tekenreeks splitsen en invoegen met behulp van een door de gebruiker gedefinieerde tabelwaardefunctie.