Database
 sql >> Base de Dados >  >> RDS >> Database

Várias maneiras de inserir strings delimitadas divididas em uma coluna


Neste artigo, demonstrarei várias maneiras de dividir a string delimitada e inseri-la em uma coluna de uma tabela no SQL Server. Você pode fazer isso usando os seguintes métodos:
  1. Converta a string delimitada em XML, use XQuery para dividir a string e salve-a na tabela.
  2. Crie uma função com valor de tabela definida pelo usuário para dividir a string e inseri-la na tabela.
  3. Divida a string usando a função STRING_SPLIT e insira a saída em uma tabela.

Para demonstrar os métodos acima, deixe-me preparar uma configuração de demonstração. Primeiro, vamos criar uma tabela chamada Employee em Banco de dados de demonstração . Para isso, precisamos executar a seguinte consulta:
USE DEMODATABASE 
GO 

CREATE TABLE EMPLOYEE 
  ( 
     ID            INT IDENTITY (1, 1), 
     EMPLOYEE_NAME VARCHAR(MAX) 
  )

Para esta demonstração, inseriremos os nomes de todos os funcionários em uma linha e os nomes dos funcionários serão separados por uma vírgula. Para isso, precisamos executar a seguinte consulta:
INSERT INTO EMPLOYEE 
            (EMPLOYEE_NAME) 
VALUES      ('DULCE , MARA , PHILIP , KATHLEEN, NEREIDA , GASTON , ETTA , EARLEAN , VINCENZA')

Execute a consulta a seguir para verificar se os dados foram inseridos na coluna.
SELECT * 
FROM   EMPLOYEE

Segue a saída:



Como mencionei acima, vamos dividir a string delimitada e inseri-la em uma tabela. Então, vamos criar uma tabela chamada Employee_Detail para armazenar a sequência de caracteres delimitada dividida por qualquer um dos métodos acima.

Para criar uma tabela, execute o seguinte código:
USE DEMODATABASE 
GO 
CREATE TABLE EMPLOYEE_DETAIL 
  ( 
     ID      INT IDENTITY(1, 1) PRIMARY KEY CLUSTERED, 
     EMPNAME VARCHAR(MAX) NOT NULL 
  )

Método 1:use a função STRING_SPLIT para dividir a string delimitada


Usaremos o STRING_SPLIT função para dividir a string em uma coluna e inseri-la em uma tabela. Antes de fazermos isso, deixe-me explicar sobre o STRING_SPLIT função.

O que é a função STRING_SPLIT


STRING_SPLIT é uma função com valor de tabela, introduzida no SQL Server 2016. Essa função divide a string com base no caractere especial dentro da linha e retorna a saída em uma tabela separada. Podemos usar esta função nos bancos de dados que possuem nível de compatibilidade igual ou superior a 130.

A função STRING_SPLIT aceita dois parâmetros e retorna uma tabela com os valores separados. A seguir está a sintaxe da função STRING_SPLIT.
SELECT STRING_SPLIT (STRING, SPECIALCHARACTER)

Na sintaxe acima, SPECIALCHARACTER é um caractere que será usado para separar a string de entrada.

O seguinte é um exemplo simples da função STRING_SPLIT.
DECLARE @STRING VARCHAR(MAX) 
DECLARE @SPECIALCHARACTER CHAR(1) 
SET @STRING='NISARG,NIRALI,RAMESH,SURESH' 
SELECT * 
FROM   STRING_SPLIT (@STRING, ',')

O seguinte é uma saída da consulta:



Como você pode ver no exemplo acima, o nome da coluna de saída retornado por STRING_SPLIT é “valor”. Podemos filtrar a saída retornada pela função usando a cláusula WHERE na coluna “valor” e também podemos classificar a ordem de saída usando o comando ORDER BY cláusula na coluna “valor”.

O seguinte é um exemplo.



Agora para inserir uma string delimitada em uma tabela, realizaremos as seguintes tarefas:
  1. Crie uma variável chamada @EmployeeName , que contém a saída do Employee tabela. Para fazer isso, execute o seguinte código:
    DECLARE @EMPLOYEENAME VARCHAR(MAX) 
    SET @EMPLOYEENAME =(SELECT EMPLOYEE_NAME 
                        FROM   EMPLOYEE)
  2. Crie outra variável chamada @Separator do tipo de dados char. Essa variável contém o valor do separador, que será usado para dividir as strings em vários valores. Para criar a variável e atribuir o valor ao separador, execute o seguinte código:
    DECLARE @SEPARATOR CHAR(1) 
    SET @SEPARATOR=','
  3. Agora use o “STRING_SPLIT ” para dividir os valores do employee_name coluna do Funcionário tabela e insira os valores em EMPLOYEENAME tabela. Para fazer isso, execute o seguinte código:
    INSERT INTO EMPLOYEE_DETAIL 
                (EMPNAME) 
    SELECT * 
    FROM   STRING_SPLIT(@EMPLOYEENAME, @SEPARATOR)

Segue o roteiro completo:
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)

Execute o script acima. O script irá inserir nove linhas na tabela. Depois de executá-lo, verifique se os dados foram inseridos no EMPLOYEENAME tabela. Para isso, execute a seguinte consulta:
SELECT * 
FROM   EMPLOYEE_DETAIL

Segue a saída:


Método 2:divida a string usando XML e insira a saída na tabela


Quando queremos dividir a string delimitada, podemos fazê-lo usando funções com valor de tabela. Como sabemos, as funções com valor de tabela definidas pelo usuário consomem muitos recursos e devem ser evitadas. Nesses casos, não temos muitas opções disponíveis. Como mencionei, o STRING_SPLIT A função pode ser usada para os bancos de dados que possuem nível de compatibilidade maior ou igual a 130. Nessas circunstâncias, é difícil encontrar uma maneira de dividir uma string delimitada. Criamos uma solução simples e eficiente para esta tarefa. Podemos dividir a string usando XML.

Então, nesta seção, vou explicar o código de XML que pode ser usado para inserir a string delimitada por divisão em diferentes linhas de uma coluna.

Eu dividi todo o código em três etapas.

Etapa 1 :Converta a string delimitada no formato XML. Para isso, execute o seguinte código:
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

Segue a saída:



Para visualizar toda a string XML, clique na célula conforme mostrado na imagem acima. Depois de clicar na célula, o arquivo XML deve ter a seguinte aparência:
<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>

Etapa 2 :Depois que a string for convertida em XML, use o X-Query para consultar o arquivo XML. Para isso, execute o seguinte código:
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)

Segue a saída:



Etapa 3 :insira a saída gerada pela consulta executada acima no Employee_Detail tabela. Para isso, execute o seguinte código:
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)
 */

Depois que os dados forem inseridos, execute o script a seguir para verificar se os dados foram inseridos. Execute a seguinte consulta:
USE DEMODATABASE 
GO 
SELECT * 
FROM   EMPLOYEE_DETAIL

O seguinte é a saída.


Método 3:dividir a string usando a função com valor de tabela e inserir a saída da função na tabela


Essa abordagem é tradicional e tem suporte em todas as versões e edições do SQL Server. Nesta abordagem, criaremos uma função com valor de tabela definida pelo usuário que usará o loop while e as funções CHARINDEX e SUBSTRING.

Segue o código para criar uma função:
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

Depois que a função for criada, execute a consulta a seguir para dividir a consulta e inserir a saída no Employee_Detail tabela.
DECLARE @SQLQUERY NVARCHAR(MAX) 
SET @SQLQUERY=(SELECT EMPLOYEE_NAME 
               FROM   EMPLOYEE) 
INSERT INTO EMPLOYEE_DETAIL 
SELECT * 
FROM   SPLIT_DELIMITED_STRING(@SQLQUERY, ',')

Depois que os dados forem inseridos na tabela, execute a seguinte consulta para verificar se os dados foram inseridos corretamente

Resumo


Neste artigo, abordei:
  1. Diferente abordagem para dividir e inserir a string delimitada na tabela.
  2. Alto nível é o resumo da função STRING_SPLIT.
  3. Divida e insira uma string delimitada usando XML e XQuery.
  4. Divida e insira uma string delimitada usando uma função com valor de tabela definida pelo usuário.