Database
 sql >> база данни >  >> RDS >> Database

Няколко начина за вмъкване на разделени разделени низове в колона

В тази статия ще демонстрирам няколко начина за разделяне на разделения низ и вмъкването му в колона на таблица в SQL Server. Можете да го направите, като използвате следните методи:

  1. Преобразувайте низ с разделители в XML, използвайте XQuery, за да разделите низа и го запазете в таблицата.
  2. Създайте дефинирана от потребителя функция с таблица, за да разделите низа и да го вмъкнете в таблицата.
  3. Разделете низа с помощта на функцията 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 клауза в колоната „стойност“.

Следва пример.

Сега, за да вмъкнем низ с разделители в таблица, ще изпълним следните задачи:

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

След като данните бъдат вмъкнати в таблицата, изпълнете следната заявка, за да проверите дали данните са били вмъкнати правилно

Резюме

В тази статия разгледах:

  1. Различен подход за разделяне и вмъкване на ограничен низ в таблицата.
  2. Високото ниво е обобщение на функцията STRING_SPLIT.
  3. Разделете и вмъкнете разделен низ с помощта на XML и XQuery.
  4. Разделете и вмъкнете разделен низ с помощта на дефинирана от потребителя функция с таблица.

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ролята на DBA в NoSQL

  2. UML нотация

  3. SQL Azure:База данни XXXYYY на сървъра в момента не е налична

  4. Как да пуснете таблица в SQL

  5. Съвети за заключвания за четене/запис в зависимост от нивото на изолация на транзакциите в MSSQL