В тази статия ще демонстрирам няколко начина за разделяне на разделения низ и вмъкването му в колона на таблица в 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.
- Разделете и вмъкнете разделен низ с помощта на дефинирана от потребителя функция с таблица.