W tym artykule zademonstruję kilka sposobów dzielenia rozdzielanego ciągu i wstawiania go do kolumny tabeli w SQL Server. Możesz to zrobić za pomocą następujących metod:
- Konwertuj rozdzielany ciąg na XML, użyj XQuery do podzielenia ciągu i zapisz go w tabeli.
- Utwórz zdefiniowaną przez użytkownika funkcję wartości w tabeli, aby podzielić ciąg i wstawić go do tabeli.
- Podziel ciąg znaków za pomocą funkcji STRING_SPLIT i wstaw wynik do tabeli.
Aby zademonstrować powyższe metody, przygotuję konfigurację demonstracyjną. Najpierw utwórzmy tabelę o nazwie Pracownik w Bazie DemoData . W tym celu musimy wykonać następujące zapytanie:
USE DEMODATABASE
GO
CREATE TABLE EMPLOYEE
(
ID INT IDENTITY (1, 1),
EMPLOYEE_NAME VARCHAR(MAX)
) W tym pokazie wstawimy nazwiska wszystkich pracowników w jednym wierszu, a nazwiska pracowników zostaną oddzielone przecinkiem. W tym celu musimy wykonać następujące zapytanie:
INSERT INTO EMPLOYEE
(EMPLOYEE_NAME)
VALUES ('DULCE , MARA , PHILIP , KATHLEEN, NEREIDA , GASTON , ETTA , EARLEAN , VINCENZA') Wykonaj następujące zapytanie, aby sprawdzić, czy dane zostały wstawione do kolumny.
SELECT * FROM EMPLOYEE
Oto wynik:

Jak wspomniałem powyżej, podzielimy oddzielony ciąg i wstawimy go do tabeli. Dlatego utworzymy tabelę o nazwie Employee_Detail do przechowywania rozdzielanego ciągu podzielonego dowolną z powyższych metod.
Aby utworzyć tabelę, wykonaj następujący kod:
USE DEMODATABASE
GO
CREATE TABLE EMPLOYEE_DETAIL
(
ID INT IDENTITY(1, 1) PRIMARY KEY CLUSTERED,
EMPNAME VARCHAR(MAX) NOT NULL
) Metoda 1:Użyj funkcji STRING_SPLIT, aby podzielić rozdzielany ciąg
Użyjemy STRING_SPLIT funkcja podzielenia ciągu w kolumnie i wstawienia go do tabeli. Zanim to zrobimy, pozwól mi wyjaśnić STRING_SPLIT funkcja.
Co to jest funkcja STRING_SPLIT
STRING_SPLIT to funkcja zwracająca tabelę, wprowadzona w SQL Server 2016. Ta funkcja dzieli ciąg na podstawie znaku specjalnego w wierszu i zwraca dane wyjściowe w osobnej tabeli. Możemy użyć tej funkcji w bazach danych, które mają poziom zgodności równy lub wyższy niż 130.
Funkcja STRING_SPLIT przyjmuje dwa parametry i zwraca tabelę z oddzielonymi wartościami. Poniżej znajduje się składnia funkcji STRING_SPLIT.
SELECT STRING_SPLIT (STRING, SPECIALCHARACTER)
W powyższej składni SPECIALCHARACTER to jeden znak, który zostanie użyty do oddzielenia ciągu wejściowego.
Poniżej znajduje się prosty przykład funkcji STRING_SPLIT.
DECLARE @STRING VARCHAR(MAX) DECLARE @SPECIALCHARACTER CHAR(1) SET @STRING='NISARG,NIRALI,RAMESH,SURESH' SELECT * FROM STRING_SPLIT (@STRING, ',')
Poniżej znajduje się wynik zapytania:

Jak widać w powyższym przykładzie, nazwa kolumny wyjściowej zwrócona przez STRING_SPLIT to „wartość”. Możemy filtrować dane wyjściowe zwracane przez funkcję za pomocą klauzuli WHERE w kolumnie „value”, a także możemy sortować wyniki wyjściowe za pomocą ORDER BY klauzula w kolumnie „wartość”.
Oto przykład.

Teraz, aby wstawić rozdzielany ciąg do tabeli, wykonamy następujące zadania:
- Utwórz zmienną o nazwie @EmployeeName , który zawiera dane wyjściowe Pracownika stół. Aby to zrobić, wykonaj następujący kod:
DECLARE @EMPLOYEENAME VARCHAR(MAX) SET @EMPLOYEENAME =(SELECT EMPLOYEE_NAME FROM EMPLOYEE) - Utwórz kolejną zmienną o nazwie @Separator typu danych char. Ta zmienna przechowuje wartość separatora, który zostanie użyty do podzielenia ciągów na wiele wartości. Aby utworzyć zmienną i przypisać wartość do separatora, wykonaj następujący kod:
DECLARE @SEPARATOR CHAR(1) SET @SEPARATOR=','
- Teraz użyj „STRING_SPLIT ” funkcja do dzielenia wartości nazwy_pracownika kolumna Pracownik tabeli i wstaw wartości do NAZWA PRACOWNIKA stół. Aby to zrobić, wykonaj następujący kod:
INSERT INTO EMPLOYEE_DETAIL (EMPNAME) SELECT * FROM STRING_SPLIT(@EMPLOYEENAME, @SEPARATOR)
Oto cały skrypt:
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) Wykonaj powyższy skrypt. Skrypt wstawi dziewięć wierszy do tabeli. Po wykonaniu upewnij się, że dane zostały wstawione do NAZWA PRACOWNIKA stół. W tym celu wykonaj następujące zapytanie:
SELECT * FROM EMPLOYEE_DETAIL
Oto wynik:

Metoda 2:Podziel ciąg znaków za pomocą XML i wstaw wynik do tabeli
Kiedy chcemy podzielić rozdzielany ciąg, możemy to zrobić za pomocą funkcji z wartościami tabelarycznymi. Jak wiemy, funkcje z wartościami przechowywanymi w tabeli zdefiniowane przez użytkownika wymagają dużej ilości zasobów i należy ich unikać. W takich przypadkach nie mamy wielu dostępnych opcji. Jak wspomniałem, STRING_SPLIT Funkcja może być używana dla baz danych, które mają poziom zgodności większy lub równy 130. W takich okolicznościach trudno jest znaleźć sposób na rozdzielenie oddzielonego łańcucha. Stworzyliśmy proste i wydajne rozwiązanie do tego zadania. Możemy podzielić ciąg za pomocą XML.
Tak więc w tej sekcji wyjaśnię kod XML, który może być użyty do wstawienia podzielonego rozdzielanego ciągu w różnych wierszach kolumny.
Cały kod podzieliłem na trzy kroki.
Krok 1 :Konwertuj rozdzielany ciąg na format XML. Aby to zrobić, wykonaj następujący 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 Oto wynik:

Aby wyświetlić cały ciąg XML, kliknij komórkę, jak pokazano na powyższym obrazku. Po kliknięciu komórki plik XML powinien wyglądać następująco:
<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 :Gdy ciąg zostanie przekonwertowany na XML, użyj X-Query, aby wysłać zapytanie do pliku XML. Aby to zrobić, wykonaj następujący 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) Oto wynik:

Krok 3 :wstaw wynik wygenerowany przez zapytanie wykonane powyżej do Szczegóły_pracownika stół. Aby to zrobić, wykonaj następujący 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)
*/ Po wstawieniu danych wykonaj następujący skrypt, aby sprawdzić, czy dane zostały wstawione. Wykonaj następujące zapytanie:
USE DEMODATABASE GO SELECT * FROM EMPLOYEE_DETAIL
Poniżej znajduje się wynik.

Metoda 3:Podziel ciąg znaków za pomocą funkcji z wartościami przechowywanymi w tabeli i wstaw wynik funkcji do tabeli
To podejście jest tradycyjne i jest obsługiwane we wszystkich wersjach i wydaniach SQL Server. W tym podejściu stworzymy zdefiniowaną przez użytkownika funkcję z wartościami w tabeli, która będzie używać pętli while oraz funkcji CHARINDEX i SUBSTRING.
Poniżej znajduje się kod do utworzenia funkcji:
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 Po utworzeniu funkcji wykonaj następujące zapytanie, aby podzielić zapytanie i wstaw dane wyjściowe do Szczegóły_pracownika tabela.
DECLARE @SQLQUERY NVARCHAR(MAX)
SET @SQLQUERY=(SELECT EMPLOYEE_NAME
FROM EMPLOYEE)
INSERT INTO EMPLOYEE_DETAIL
SELECT *
FROM SPLIT_DELIMITED_STRING(@SQLQUERY, ',') Po wstawieniu danych do tabeli wykonaj następujące zapytanie, aby sprawdzić, czy dane zostały wstawione prawidłowo
Podsumowanie
W tym artykule omówiłem:
- Inne podejście do dzielenia i wstawiania rozdzielanego ciągu w tabeli.
- Wysoki poziom to podsumowanie funkcji STRING_SPLIT.
- Podziel i wstaw rozdzielany ciąg za pomocą XML i XQuery.
- Podziel i wstaw rozdzielany ciąg za pomocą zdefiniowanej przez użytkownika funkcji z wartościami w tabeli.