V tomto článku ukážu několik způsobů, jak rozdělit řetězec s oddělovači a vložit jej do sloupce tabulky na serveru SQL Server. Můžete to udělat pomocí následujících metod:
- Převeďte řetězec s oddělovači na XML, použijte XQuery k rozdělení řetězce a uložte jej do tabulky.
- Vytvořte uživatelsky definovanou funkci tabulky s hodnotou pro rozdělení řetězce a jeho vložení do tabulky.
- Rozdělte řetězec pomocí funkce STRING_SPLIT a vložte výstup do tabulky.
Abych demonstroval výše uvedené metody, dovolte mi připravit demo nastavení. Nejprve vytvořte tabulku s názvem Zaměstnanec v Demodatabázi . K tomu musíme provést následující dotaz:
USE DEMODATABASE GO CREATE TABLE EMPLOYEE ( ID INT IDENTITY (1, 1), EMPLOYEE_NAME VARCHAR(MAX) )
Pro toto demo vložíme jména všech zaměstnanců do jednoho řádku a jména zaměstnanců budou oddělena čárkou. K tomu musíme provést následující dotaz:
INSERT INTO EMPLOYEE (EMPLOYEE_NAME) VALUES ('DULCE , MARA , PHILIP , KATHLEEN, NEREIDA , GASTON , ETTA , EARLEAN , VINCENZA')
Provedením následujícího dotazu ověřte, že data byla vložena do sloupce.
SELECT * FROM EMPLOYEE
Následuje výstup:
Jak jsem uvedl výše, oddělovací řetězec rozdělíme a vložíme do tabulky. Vytvoříme tedy tabulku s názvem Detail_zaměstnance pro uložení odděleného řetězce rozděleného některou z výše uvedených metod.
Chcete-li vytvořit tabulku, spusťte následující kód:
USE DEMODATABASE GO CREATE TABLE EMPLOYEE_DETAIL ( ID INT IDENTITY(1, 1) PRIMARY KEY CLUSTERED, EMPNAME VARCHAR(MAX) NOT NULL )
Metoda 1:Použijte funkci STRING_SPLIT k rozdělení oddělovaného řetězce
Použijeme STRING_SPLIT funkce pro rozdělení řetězce do sloupce a jeho vložení do tabulky. Než to uděláme, dovolte mi vysvětlit STRING_SPLIT funkce.
Co je funkce STRING_SPLIT
STRING_SPLIT je funkce s hodnotou tabulky, zavedená v SQL Server 2016. Tato funkce rozděluje řetězec na základě speciálního znaku v řádku a vrací výstup v samostatné tabulce. Tuto funkci můžeme použít u databází, které mají úroveň kompatibility rovnou nebo vyšší než 130.
Funkce STRING_SPLIT přijímá dva parametry a vrací tabulku s oddělenými hodnotami. Následuje syntaxe funkce STRING_SPLIT.
SELECT STRING_SPLIT (STRING, SPECIALCHARACTER)
Ve výše uvedené syntaxi je SPECIALCHARACTER jeden znak, který bude použit k oddělení vstupního řetězce.
Následuje jednoduchý příklad funkce STRING_SPLIT.
DECLARE @STRING VARCHAR(MAX) DECLARE @SPECIALCHARACTER CHAR(1) SET @STRING='NISARG,NIRALI,RAMESH,SURESH' SELECT * FROM STRING_SPLIT (@STRING, ',')
Následuje výstup dotazu:
Jak můžete vidět ve výše uvedeném příkladu, název výstupního sloupce vrácený STRING_SPLIT je „hodnota“. Výstup vrácený funkcí můžeme filtrovat pomocí klauzule WHERE ve sloupci „hodnota“ a také můžeme seřadit pořadí výstupu pomocí ORDER BY klauzule ve sloupci „hodnota“.
Následuje příklad.
Nyní, abychom do tabulky vložili řetězec s oddělovači, provedeme následující úkoly:
- Vytvořte proměnnou s názvem @EmployeeName , která obsahuje výstup Zaměstnance stůl. Chcete-li to provést, spusťte následující kód:
DECLARE @EMPLOYEENAME VARCHAR(MAX) SET @EMPLOYEENAME =(SELECT EMPLOYEE_NAME FROM EMPLOYEE)
- Vytvořte další proměnnou s názvem @Separator datového typu char. Tato proměnná obsahuje hodnotu oddělovače, který bude použit k rozdělení řetězců na více hodnot. Chcete-li vytvořit proměnnou a přiřadit hodnotu k oddělovači, spusťte následující kód:
DECLARE @SEPARATOR CHAR(1) SET @SEPARATOR=','
- Nyní použijte „STRING_SPLIT ” funkce k rozdělení hodnot jméno_zaměstnance ve sloupci Zaměstnanec tabulky a vložte hodnoty do EMPLOYEENAME stůl. Chcete-li to provést, spusťte následující kód:
INSERT INTO EMPLOYEE_DETAIL (EMPNAME) SELECT * FROM STRING_SPLIT(@EMPLOYEENAME, @SEPARATOR)
Následuje celý skript:
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)
Spusťte výše uvedený skript. Skript vloží do tabulky devět řádků. Jakmile jej spustíte, ujistěte se, že byla data vložena do EMPLOYEENAME stůl. Za tímto účelem proveďte následující dotaz:
SELECT * FROM EMPLOYEE_DETAIL
Následuje výstup:
Metoda 2:Rozdělte řetězec pomocí XML a vložte výstup do tabulky
Když chceme rozdělit řetězec s oddělovači, můžeme to udělat pomocí tabulkových funkcí. Jak víme, uživatelsky definované tabulkové funkce jsou náročné na zdroje a je třeba se jim vyhnout. V takových případech nemáme k dispozici mnoho možností. Jak jsem již zmínil, STRING_SPLIT Funkce může být použita pro databáze, které mají úroveň kompatibility vyšší nebo rovnou 130. Za takových okolností je obtížné najít způsob, jak rozdělit řetězec s oddělovači. Pro tento úkol jsme vytvořili jednoduché a efektivní řešení. Řetězec můžeme rozdělit pomocí XML.
V této části tedy vysvětlím kód XML, který lze použít k vložení rozděleného řetězce s oddělovači do různých řádků sloupce.
Celý kód jsem rozdělil do tří kroků.
Krok 1 :Převeďte řetězec s oddělovači do formátu XML. Chcete-li to provést, spusťte následující kód:
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
Následuje výstup:
Chcete-li zobrazit celý řetězec XML, klikněte na buňku, jak je znázorněno na obrázku výše. Po kliknutí na buňku by měl soubor XML vypadat takto:
<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>
Krok 2 :Jakmile je řetězec převeden na XML, použijte X-Query k dotazu na soubor XML. Chcete-li to provést, spusťte následující kód:
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)
Následuje výstup:
Krok 3 :Vložte výstup generovaný dotazem provedeným výše do Employee_Detail stůl. Chcete-li to provést, spusťte následující kód:
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) */
Po vložení dat spusťte následující skript, abyste ověřili, že byla data vložena. Proveďte následující dotaz:
USE DEMODATABASE GO SELECT * FROM EMPLOYEE_DETAIL
Následuje výstup.
Metoda 3:Rozdělte řetězec pomocí funkce s hodnotou tabulky a vložte výstup funkce do tabulky
Tento přístup je tradiční a je podporován ve všech verzích a edicích SQL Server. V tomto přístupu vytvoříme uživatelem definovanou tabulkovou funkci, která bude používat smyčku while a funkce CHARINDEX a SUBSTRING.
Následuje kód pro vytvoření funkce:
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
Jakmile je funkce vytvořena, spusťte následující dotaz pro rozdělení dotazu a vložení výstupu do Detail_zaměstnance tabulka.
DECLARE @SQLQUERY NVARCHAR(MAX) SET @SQLQUERY=(SELECT EMPLOYEE_NAME FROM EMPLOYEE) INSERT INTO EMPLOYEE_DETAIL SELECT * FROM SPLIT_DELIMITED_STRING(@SQLQUERY, ',')
Jakmile jsou data vložena do tabulky, proveďte následující dotaz, abyste ověřili, že data byla vložena správně
Shrnutí
V tomto článku jsem se zabýval:
- Jiný přístup k rozdělení a vložení odděleného řetězce do tabulky.
- Vysoká úroveň je souhrn funkce STRING_SPLIT.
- Rozdělte a vložte oddělený řetězec pomocí XML a XQuery.
- Rozdělte a vložte řetězec s oddělovači pomocí uživatelsky definované funkce s hodnotou tabulky.