¿Cómo dividir cadenas con carga limitada en SQL Server?

En este artículo, analizaremos algunas formas de dividir el valor de cable delimitado. Se puede lograr a través de numerosos métodos, incluidos.

  • Utilice la función STRING_SPLIT para dividir el cable
  • Cree una función de valoración de tabla definida por el usuario para dividir el cable,
  • Utilice XQuery para dividir el valor del cable y convertir un cable limitado a XML

Primero, necesitamos crear una tabla e ingresar datos que se usarán en los tres métodos. La tabla debe constar de una fila con identificación de campo y una cadena con caracteres limitadores. Cree una tabla llamada «estudiante» usando el siguiente código.

CREATE TABLE student
  (
     ID INT IDENTITY (1, 1),
     student_name VARCHAR(MAX)
  )

Ingrese los nombres de los estudiantes separados por comas consecutivas ejecutando el siguiente código.

INSERT INTO student (student_name)
VALUES ('Monroy,Montanez,Marolahakis,Negley,Albright,Garofolo,Pereira,Johnson,Wagner,Conrad')
Crea una tabla e ingresa datos

Confirme si los datos se han ingresado en la tabla o no usando el siguiente código.

select * from student
Confirme si se han ingresado los detalles en la tabla «estudiante»

Método 1: use la función STRING_SPLIT para dividir el cable

En SQL Server 2016, «STRING_SPLIT» introdujo una función que se puede utilizar con un nivel de compatibilidad de 130 y superior. Si está utilizando SQL Server versión 2016 o superior, puede utilizar esta función de compilación.

Tan bueno como eso «STRING_SPLIT» entradas de cadena que tienen subcadenas delimitadas y una entrada de un solo carácter para usar como delimitador o separador. La función de tabla genera una sola columna que contiene las subcadenas. La columna de salida se llama «Valor «. Esta función obtiene dos parámetros. El primer parámetro es una cadena y el segundo es un carácter delimitador o separador en función del cual necesitamos dividir el cable. La salida contiene una tabla de una sola columna que contiene sustratos. Esta columna de salida se llama «Valor» como vemos en la figura siguiente. Además, el «SPRIT STRING» La función table_valued devuelve una tabla vacía si NULL es una cadena de entrada.

Nivel de compatibilidad de la base de datos:

Todos base de datos es atado le a compatibilidad nivel. Eso habilita un base de datos comportamiento a ser compatible con thmi cierto SQL Servidor versión eso carreras en.

Ahora introduciremos una función «string_split» para limitar una cadena para dividir comas. Pero el nivel de compatibilidad era inferior a 130 y, por lo tanto, se generó un error. «Nombre de objeto no válido ‘SPLIT_STRING'»

Se produce un error si el nivel de compatibilidad de la base de datos es inferior a 130 «Nombre de objeto split_string no válido»

Entonces tenemos que establecer el nivel de compatibilidad de la base de datos en 130 o más. Entonces, seguiremos estos pasos para establecer el nivel de compatibilidad de la base de datos.

  • Primero configure una base de datos en “single_user_access_mode” usando el siguiente código.
ALTER DATABASE <[database_name]> SET SINGLE_USER
  • En segundo lugar, cambie el nivel de compatibilidad de la base de datos utilizando el siguiente código.
ALTER DATABASE <[database_name]> SET COMPATIBILITY_LEVEL = 130
  • Restaure la base de datos al modo de acceso multiusuario usando el siguiente código.
ALTER DATABASE <[database_name]> SET MULTI_USER
USE [master]
GO
ALTER DATABASE [bridge_centrality] SET SINGLE_USER
ALTER DATABASE [bridge_centrality] SET COMPATIBILITY_LEVEL = 130
ALTER DATABASE [bridge_centrality] SET MULTI_USER
GO

La salida será:

Cambiar el nivel de compatibilidad a 130

Ahora ejecute este código para obtener el resultado requerido.

DECLARE @string_value VARCHAR(MAX) ;
SET @string_value="Monroy,Montanez,Marolahakis,Negley,Albright,Garofolo,Pereira,Johnson,Wagner,Conrad"
SELECT * FROM  STRING_SPLIT (@string_value, ',')

El resultado de esta pregunta es:

Salida de la función «split_string» build_in

Método 2: Para dividir el cable, cree una función de tabla de valores definida por el usuario

Seguro, todas las versiones de SQL Server son compatibles con este método tradicional. En esta técnica crearemos una función definida por el usuario para dividir el cable por carácter delimitado usando “SUBSTRINGFunción, «CHARINDEX”Y bucle while. Esta función se puede utilizar para agregar datos a la tabla de salida porque el tipo de retorno es «tabla».

CREATE FUNCTION [dbo].[split_string]
(
    @string_value NVARCHAR(MAX),
    @delimiter_character CHAR(1)
)
RETURNS @result_set TABLE(splited_data NVARCHAR(MAX)
)
BEGIN
    DECLARE @start_position INT,
            @ending_position INT
    SELECT @start_position = 1,
            @ending_position = CHARINDEX(@delimiter_character, @string_value)
    WHILE @start_position < LEN(@string_value) + 1
            BEGIN
        IF @ending_position = 0 
           SET @ending_position = LEN(@string_value) + 1
        INSERT INTO @result_set (splited_data) 
        VALUES(SUBSTRING(@string_value, @start_position, @ending_position - @start_position))
        SET @start_position = @ending_position + 1
        SET @ending_position = CHARINDEX(@delimiter_character, @string_value, @start_position)
    END
    RETURN
END

Ahora ejecute el siguiente script para llamar a una función de división para dividir una cadena por carácter delimitado.

DECLARE @student_name VARCHAR(MAX);
DECLARE @delimiter CHAR(1);
SET @delimiter=","
SET @student_name =(SELECT student_name FROM   student)
SELECT * FROM dbo.split_string(@student_name, @delimiter)

El resultado se establecerá así.

Resultado fijo de la función de valor de la tabla split_string

Método 3: Utilice XQuery para dividir el valor del cable y convertir un cable limitado a XML

Debido a que las funciones definidas por el usuario abarcan todos los recursos, debemos evitar estas funciones. Otra opción es una función incorporada «string_split», pero esta función se puede utilizar para bases de datos con un nivel de compatibilidad de 130 o superior. Entonces aquí viene otra solución para resolver esta difícil tarea. La cadena se puede dividir usando lo siguiente XML.

DECLARE @xml_value AS XML,
        @string_value AS VARCHAR(2000),
        @delimiter_value AS VARCHAR(15)
SET @string_value=(SELECT student_name FROM student)
SET @delimiter_value=","
SET @xml_value = Cast(( '<studentname>'
                  + Replace(@string_value, @delimiter_value, '</studentname><studentname>')
                  + '</studentname>' ) AS XML)
SELECT @xml_value

El resultado de esta pregunta es:

Paso 1 para dividir un cable usando XML

Si desea ver el archivo XML completo. Clic en el enlace. Cuando haga clic en el enlace, el código se verá así.

Un archivo XML que contiene nodos cableados individuales para dividir

Ahora el cable XML debería procesarse más. Finalmente, usaremos «x-Query» para hacer preguntas desde XML.

DECLARE @xml_value AS XML,
        @string_value AS VARCHAR(2000),
        @delimiter_value AS VARCHAR(15)
SET @string_value=(SELECT student_name FROM student)
SET @delimiter_value=","
SET @xml_value = Cast(( '<studentname>'
                  + Replace(@string_value, @delimiter_value, '</studentname><studentname>')
                  + '</studentname>' ) AS XML)
SELECT   x.m.query('.').value('.', 'VARCHAR(15)') AS VALUE
FROM   @xml_value.nodes('/studentname') AS x(m)

La salida será la siguiente:

Utilice «XQuery» para hacer preguntas desde el XML