В тази статия ще демонстрирам няколко начина за разделяне на разделения низ и вмъкването му в колона на таблица в SQL Server. Можете да го направите, като използвате следните методи:
- Преобразувайте низ с разделители в XML, използвайте XQuery, за да разделите низа и го запазете в таблицата.
- Създайте дефинирана от потребителя функция с таблица, за да разделите низа и да го вмъкнете в таблицата.
- Разделете низа с помощта на функцията STRING_SPLIT и вмъкнете изхода в таблица.
За да демонстрирам горните методи, нека подготвя демонстрационна настройка. Първо, нека създадем таблица с име Служител в DemoDatabase . За да направим това, трябва да изпълним следната заявка:
USE DEMODATABASE
GO
CREATE TABLE EMPLOYEE
(
ID INT IDENTITY (1, 1),
EMPLOYEE_NAME VARCHAR(MAX)
) За тази демонстрация ще вмъкнем имената на всички служители в един ред и имената на служителите ще бъдат разделени със запетая. За да направим това, трябва да изпълним следната заявка:
INSERT INTO EMPLOYEE
(EMPLOYEE_NAME)
VALUES ('DULCE , MARA , PHILIP , KATHLEEN, NEREIDA , GASTON , ETTA , EARLEAN , VINCENZA') Изпълнете следната заявка, за да проверите дали данните са били вмъкнати в колоната.
SELECT * FROM EMPLOYEE
Следното е изходът:

Както споменах по-горе, ще разделим ограничения низ и ще го вмъкнем в таблица. И така, ще създадем таблица с име Employee_Detail за да съхраните разделения низ чрез някой от горните методи.
За да създадете таблица, изпълнете следния код:
USE DEMODATABASE
GO
CREATE TABLE EMPLOYEE_DETAIL
(
ID INT IDENTITY(1, 1) PRIMARY KEY CLUSTERED,
EMPNAME VARCHAR(MAX) NOT NULL
) Метод 1:Използвайте функцията STRING_SPLIT, за да разделите разделения низ
Ще използваме STRING_SPLIT функция за разделяне на низа в колона и вмъкване в таблица. Преди да направим това, нека обясня за STRING_SPLIT функция.
Какво е функция STRING_SPLIT
STRING_SPLIT е функция с таблично значение, въведена в SQL Server 2016. Тази функция разделя низа въз основа на специалния знак в реда и връща изхода в отделна таблица. Можем да използваме тази функция за бази данни, които имат ниво на съвместимост равно или по-високо от 130.
Функцията STRING_SPLIT приема два параметъра и връща таблица с разделените стойности. Следва синтаксисът на функцията STRING_SPLIT.
SELECT STRING_SPLIT (STRING, SPECIALCHARACTER)
В горния синтаксис SPECIALCHARACTER е един знак, който ще се използва за разделяне на входния низ.
Следва прост пример за функцията STRING_SPLIT.
DECLARE @STRING VARCHAR(MAX) DECLARE @SPECIALCHARACTER CHAR(1) SET @STRING='NISARG,NIRALI,RAMESH,SURESH' SELECT * FROM STRING_SPLIT (@STRING, ',')
Следното е изход от заявката:

Както можете да видите в горния пример, името на изходната колона, върнато от STRING_SPLIT е „стойност“. Можем да филтрираме изхода, върнат от функцията, използвайки клаузата WHERE в колоната „стойност“, а също така можем да сортираме реда на изхода с помощта на ORDER BY клауза в колоната „стойност“.
Следва пример.

Сега, за да вмъкнем низ с разделители в таблица, ще изпълним следните задачи:
- Създайте променлива с име @EmployeeName , който съдържа изходните данни на Служител маса. За да направите това, изпълнете следния код:
DECLARE @EMPLOYEENAME VARCHAR(MAX) SET @EMPLOYEENAME =(SELECT EMPLOYEE_NAME FROM EMPLOYEE) - Създайте друга променлива, наречена @Separator от типа данни char. Тази променлива съдържа стойността на разделителя, който ще се използва за разделяне на низовете на множество стойности. За да създадете променливата и да присвоите стойността на разделителя, изпълнете следния код:
DECLARE @SEPARATOR CHAR(1) SET @SEPARATOR=','
- Сега използвайте „STRING_SPLIT ” функция за разделяне на стойностите на imployee_name колона на Служител таблица и вмъкнете стойностите в EMPLOYEENAME маса. За да направите това, изпълнете следния код:
INSERT INTO EMPLOYEE_DETAIL (EMPNAME) SELECT * FROM STRING_SPLIT(@EMPLOYEENAME, @SEPARATOR)
Следва целия скрипт:
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) Изпълнете горния скрипт. Скриптът ще вмъкне девет реда в таблицата. След като го изпълните, уверете се, че данните са вмъкнати в EMPLOYEENAME маса. За целта изпълнете следната заявка:
SELECT * FROM EMPLOYEE_DETAIL
Следното е изходът:

Метод 2:Разделете низ чрез XML и вмъкнете изхода в таблицата
Когато искаме да разделим низа с разделители, можем да го направим с помощта на функции с таблица. Както знаем, дефинираните от потребителя функции с таблична стойност са ресурсоемки и трябва да се избягват. В такива случаи не разполагаме с много опции. Както споменах, STRING_SPLIT функцията може да се използва за бази данни, които имат ниво на съвместимост по-голямо или равно на 130. При такива обстоятелства е трудно да се намери начин за разделяне на низ с разделители. Създадохме просто и ефективно решение за тази задача. Можем да разделим низа с помощта на XML.
И така, в този раздел ще обясня кода на XML, който може да се използва за вмъкване на разделен разделен низ в различни редове на колона.
Разделих целия код на три стъпки.
Стъпка 1 :Преобразувайте разделения низ в XML формат. За да направите това, изпълнете следния код:
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 Следното е изходът:

За да видите целия XML низ, щракнете върху клетката, както е показано на изображението по-горе. След като щракнете върху клетката, XML файлът трябва да изглежда по следния начин:
<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>
Стъпка 2 :След като низът се преобразува в XML, използвайте X-Query, за да направите заявка за XML файла. За да направите това, изпълнете следния код:
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) Следното е изходът:

Стъпка 3 :Вмъкнете изхода, генериран от заявката, изпълнена по-горе, в Подробности за_служещия маса. За да направите това, изпълнете следния код:
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)
*/ След като данните бъдат вмъкнати, изпълнете следния скрипт, за да проверите дали данните са били вмъкнати. Изпълнете следната заявка:
USE DEMODATABASE GO SELECT * FROM EMPLOYEE_DETAIL
Следва изходът.

Метод 3:Разделяне на низ с помощта на функция с таблица и вмъкване на изхода на функцията в таблицата
Този подход е традиционен и се поддържа във всички версии и издания на SQL Server. При този подход ще създадем дефинирана от потребителя функция с таблична стойност, която ще използва цикъл while и функции CHARINDEX и SUBSTRING.
Следва кодът за създаване на функция:
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 След като функцията е създадена, изпълнете следната заявка, за да разделите заявката и да вмъкнете изхода вПодробности за служителите таблица.
DECLARE @SQLQUERY NVARCHAR(MAX)
SET @SQLQUERY=(SELECT EMPLOYEE_NAME
FROM EMPLOYEE)
INSERT INTO EMPLOYEE_DETAIL
SELECT *
FROM SPLIT_DELIMITED_STRING(@SQLQUERY, ',') След като данните бъдат вмъкнати в таблицата, изпълнете следната заявка, за да проверите дали данните са били вмъкнати правилно
Резюме
В тази статия разгледах:
- Различен подход за разделяне и вмъкване на ограничен низ в таблицата.
- Високото ниво е обобщение на функцията STRING_SPLIT.
- Разделете и вмъкнете разделен низ с помощта на XML и XQuery.
- Разделете и вмъкнете разделен низ с помощта на дефинирана от потребителя функция с таблица.