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:
- Converta a string delimitada em XML, use XQuery para dividir a string e salve-a na tabela.
- Crie uma função com valor de tabela definida pelo usuário para dividir a string e inseri-la na tabela.
- 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:
- 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)
- 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=','
- 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:
- Diferente abordagem para dividir e inserir a string delimitada na tabela.
- Alto nível é o resumo da função STRING_SPLIT.
- Divida e insira uma string delimitada usando XML e XQuery.
- Divida e insira uma string delimitada usando uma função com valor de tabela definida pelo usuário.