sql >> Base de Datos >  >> RDS >> Database

Varias formas de insertar cadenas delimitadas divididas en una columna

En este artículo, demostraré varias formas de dividir la cadena delimitada e insertarla en una columna de una tabla en SQL Server. Puedes hacerlo usando los siguientes métodos:

  1. Convierta la cadena delimitada en XML, use XQuery para dividir la cadena y guárdela en la tabla.
  2. Cree una función con valores de tabla definida por el usuario para dividir la cadena e insertarla en la tabla.
  3. Divida la cadena usando la función STRING_SPLIT e inserte la salida en una tabla.

Para demostrar los métodos anteriores, permítanme preparar una configuración de demostración. Primero, creemos una tabla llamada Empleado en DemoDatabase . Para hacer eso, necesitamos ejecutar la siguiente consulta:

USE DEMODATABASE 
GO 

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

Para esta demostración, insertaremos los nombres de todos los empleados en una fila y los nombres de los empleados estarán separados por una coma. Para hacer eso, necesitamos ejecutar la siguiente consulta:

INSERT INTO EMPLOYEE 
            (EMPLOYEE_NAME) 
VALUES      ('DULCE , MARA , PHILIP , KATHLEEN, NEREIDA , GASTON , ETTA , EARLEAN , VINCENZA')

Ejecute la siguiente consulta para verificar que los datos se hayan insertado en la columna.

SELECT * 
FROM   EMPLOYEE

El siguiente es el resultado:

Como mencioné anteriormente, vamos a dividir la cadena delimitada e insertarla en una tabla. Entonces, crearemos una tabla llamada Employee_Detail para almacenar la cadena delimitada dividida por cualquiera de los métodos anteriores.

Para crear una tabla, ejecute el siguiente 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:Utilice la función STRING_SPLIT para dividir la cadena delimitada

Usaremos el STRING_SPLIT para dividir la cadena en una columna e insertarla en una tabla. Antes de hacerlo, déjame explicarte sobre el STRING_SPLIT función.

¿Qué es la función STRING_SPLIT

STRING_SPLIT es una función con valores de tabla, introducida en SQL Server 2016. Esta función divide la cadena según el carácter especial dentro de la fila y devuelve el resultado en una tabla separada. Podemos utilizar esta función en las bases de datos que tengan un nivel de compatibilidad igual o superior a 130.

La función STRING_SPLIT acepta dos parámetros y devuelve una tabla con los valores separados. La siguiente es la sintaxis de la función STRING_SPLIT.

SELECT STRING_SPLIT (STRING, SPECIALCHARACTER)

En la sintaxis anterior, SPECIALCHARACTER es un carácter que se utilizará para separar la cadena de entrada.

El siguiente es un ejemplo simple de la función STRING_SPLIT.

DECLARE @STRING VARCHAR(MAX) 
DECLARE @SPECIALCHARACTER CHAR(1) 
SET @STRING='NISARG,NIRALI,RAMESH,SURESH' 
SELECT * 
FROM   STRING_SPLIT (@STRING, ',')

El siguiente es un resultado de la consulta:

Como puede ver en el ejemplo anterior, el nombre de la columna de salida devuelta por STRING_SPLIT es "valor". Podemos filtrar la salida devuelta por la función usando la cláusula WHERE en la columna "valor" y también podemos clasificar el orden de la salida usando ORDER BY cláusula en la columna "valor".

El siguiente es un ejemplo.

Ahora, para insertar una cadena delimitada en una tabla, realizaremos las siguientes tareas:

  1. Cree una variable llamada @EmployeeName , que contiene la salida del Empleado mesa. Para hacerlo, ejecute el siguiente código:
    DECLARE @EMPLOYEENAME VARCHAR(MAX) 
    SET @EMPLOYEENAME =(SELECT EMPLOYEE_NAME 
                        FROM   EMPLOYEE)
  2. Cree otra variable llamada @Separator del tipo de datos char. Esta variable contiene el valor del separador, que se utilizará para dividir las cadenas en varios valores. Para crear la variable y asignar el valor al separador, ejecute el siguiente código:
    DECLARE @SEPARATOR CHAR(1) 
    SET @SEPARATOR=','
  3. Ahora usa el "STRING_SPLIT ” función para dividir los valores de employee_name columna del Empleado e inserte los valores en el EMPLOYEENAME mesa. Para hacerlo, ejecute el siguiente código:
    INSERT INTO EMPLOYEE_DETAIL 
                (EMPNAME) 
    SELECT * 
    FROM   STRING_SPLIT(@EMPLOYEENAME, @SEPARATOR)

El siguiente es el script 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)

Ejecute el script anterior. El script insertará nueve filas en la tabla. Una vez que lo ejecute, asegúrese de que los datos se hayan insertado en el EMPLOYEENAME mesa. Para ello, ejecute la siguiente consulta:

SELECT * 
FROM   EMPLOYEE_DETAIL

El siguiente es el resultado:

Método 2:Divida la cadena usando XML e inserte la salida en la tabla

Cuando queremos dividir la cadena delimitada, podemos hacerlo usando funciones con valores de tabla. Como sabemos, las funciones con valores de tabla definidas por el usuario consumen muchos recursos y deben evitarse. En tales casos, no tenemos muchas opciones disponibles. Como mencioné, el STRING_SPLIT La función se puede usar para las bases de datos que tienen un nivel de compatibilidad mayor o igual a 130. En tales circunstancias, es difícil encontrar una manera de dividir una cadena delimitada. Hemos creado una solución simple y eficiente para esta tarea. Podemos dividir la cadena usando XML.

Entonces, en esta sección, voy a explicar el código de XML que se puede usar para insertar la cadena dividida delimitada en diferentes filas de una columna.

He dividido todo el código en tres pasos.

Paso 1 :convierte la cadena delimitada al formato XML. Para hacer eso, ejecute el siguiente 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

El siguiente es el resultado:

Para ver la cadena XML completa, haga clic en la celda como se muestra en la imagen de arriba. Una vez que haga clic en la celda, el archivo XML debería tener el siguiente aspecto:

<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>

Paso 2 :una vez que la cadena se convierte en XML, use X-Query para consultar el archivo XML. Para hacer eso, ejecute el siguiente 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)

El siguiente es el resultado:

Paso 3 :inserte el resultado generado por la consulta ejecutada anteriormente en Employee_Detail mesa. Para hacer eso, ejecute el siguiente 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)
 */

Una vez que se insertan los datos, ejecute el siguiente script para verificar que se hayan insertado los datos. Ejecute la siguiente consulta:

USE DEMODATABASE 
GO 
SELECT * 
FROM   EMPLOYEE_DETAIL

El siguiente es el resultado.

Método 3:Divida la cadena usando la función con valores de tabla e inserte la salida de la función en la tabla

Este enfoque es tradicional y se admite en todas las versiones y ediciones de SQL Server. En este enfoque, crearemos una función con valores de tabla definida por el usuario que usará el ciclo while y la función CHARINDEX y SUBSTRING.

El siguiente es el código para crear una función:

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

Una vez creada la función, ejecute la siguiente consulta para dividir la consulta e insertar el resultado en Employee_Detail mesa.

DECLARE @SQLQUERY NVARCHAR(MAX) 
SET @SQLQUERY=(SELECT EMPLOYEE_NAME 
               FROM   EMPLOYEE) 
INSERT INTO EMPLOYEE_DETAIL 
SELECT * 
FROM   SPLIT_DELIMITED_STRING(@SQLQUERY, ',')

Una vez que se insertan los datos en la tabla, ejecute la siguiente consulta para verificar que los datos se hayan insertado correctamente

Resumen

En este artículo, he cubierto:

  1. Diferente enfoque para dividir e insertar la cadena delimitada en la tabla.
  2. El nivel alto es un resumen de la función STRING_SPLIT.
  3. Divida e inserte una cadena delimitada usando XML y XQuery.
  4. Divida e inserte una cadena delimitada usando una función con valores de tabla definida por el usuario.