Principales respuestas
Crear varias filas dependiendo del contenido de un campo sin utilizar cursores

Pregunta
-
Saludos comunidad,
tengo el siguiente problema, tengo la siguiente tabla:
En el campo socio puede haber de 1 a n personas, si es una persona se mantiene la fila tal como esta, si son varias personas se separan con el caracter | y deberian repetirse sus filas.
El resultado tendria que salir de la siguiente manera:
Como resolveria este problema sin utilizar cursores.
gracias por su tiempo.
Respuestas
-
En la versión 2012 de SQL SERVER no existe una función nativa que permita descomponer una cadena en sub-cadenas a razón de un caracter de separación, en tal sentido hay que implementar una función que cubra tal cometido, una opción es haciendo uso de XML:
CREATE FUNCTION dbo.fnSepararCadena(@Texto nvarchar(max), @Separador nvarchar(4000)) RETURNS @T TABLE (Valor nvarchar(max)) AS BEGIN DECLARE @XML xml; SET @XML = N'<root><r>' + REPLACE(@Texto, @Separador,'</r><r>') + '</r></root>'; INSERT INTO @T(Valor) SELECT r.value('.', 'varchar(max)') AS Item FROM @XML.nodes('//root/r') AS records(r) RETURN END
Y la consulta -según el ejemplo mostrado- haría uso de la función de la siguiente manera:
SELECT ROW_NUMBER() OVER(ORDER BY t1.Nombre_Empresa) AS 'Id_Accionista', t1.Nombre_Empresa, t2.Socio FROM @T t1 CROSS APPLY (SELECT RTRIM(LTRIM(Valor)) FROM dbo.fnSepararCadena(t1.Socio, '|')) t2 (Socio)
Resultando:
Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.- Propuesto como respuesta Laura CeglzModerator jueves, 22 de septiembre de 2016 20:32
- Marcado como respuesta Laura CeglzModerator viernes, 23 de septiembre de 2016 16:51
-
Deberas crear una funcion, preferible una funcion tipo tabla en linea, para que puedas devolver una fila por cada elemento de la cadena delimitada.
Puedes encontrar multiples soluciones en este gran articulo de Erland Sommarskog.
Arrays and Lists in SQL Server
Mi favorito es usando una tabla de numeros, especialmente la funcion de Itzik Ben-Gan para generar una tabla auxiliar de numeros.
Si buscas en este foro encontraras varios ejemplos.
AMB
Some guidelines for posting questions...
AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas- Propuesto como respuesta Laura CeglzModerator jueves, 22 de septiembre de 2016 20:32
- Marcado como respuesta Laura CeglzModerator viernes, 23 de septiembre de 2016 16:51
Todas las respuestas
-
¿Podrías mencionar la versión del motor de SQL Server que ocupas?
-
SQL Server 2012 Standart Edition
- Editado RealMaster lunes, 19 de septiembre de 2016 23:26
-
En la versión 2012 de SQL SERVER no existe una función nativa que permita descomponer una cadena en sub-cadenas a razón de un caracter de separación, en tal sentido hay que implementar una función que cubra tal cometido, una opción es haciendo uso de XML:
CREATE FUNCTION dbo.fnSepararCadena(@Texto nvarchar(max), @Separador nvarchar(4000)) RETURNS @T TABLE (Valor nvarchar(max)) AS BEGIN DECLARE @XML xml; SET @XML = N'<root><r>' + REPLACE(@Texto, @Separador,'</r><r>') + '</r></root>'; INSERT INTO @T(Valor) SELECT r.value('.', 'varchar(max)') AS Item FROM @XML.nodes('//root/r') AS records(r) RETURN END
Y la consulta -según el ejemplo mostrado- haría uso de la función de la siguiente manera:
SELECT ROW_NUMBER() OVER(ORDER BY t1.Nombre_Empresa) AS 'Id_Accionista', t1.Nombre_Empresa, t2.Socio FROM @T t1 CROSS APPLY (SELECT RTRIM(LTRIM(Valor)) FROM dbo.fnSepararCadena(t1.Socio, '|')) t2 (Socio)
Resultando:
Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.- Propuesto como respuesta Laura CeglzModerator jueves, 22 de septiembre de 2016 20:32
- Marcado como respuesta Laura CeglzModerator viernes, 23 de septiembre de 2016 16:51
-
Deberas crear una funcion, preferible una funcion tipo tabla en linea, para que puedas devolver una fila por cada elemento de la cadena delimitada.
Puedes encontrar multiples soluciones en este gran articulo de Erland Sommarskog.
Arrays and Lists in SQL Server
Mi favorito es usando una tabla de numeros, especialmente la funcion de Itzik Ben-Gan para generar una tabla auxiliar de numeros.
Si buscas en este foro encontraras varios ejemplos.
AMB
Some guidelines for posting questions...
AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas- Propuesto como respuesta Laura CeglzModerator jueves, 22 de septiembre de 2016 20:32
- Marcado como respuesta Laura CeglzModerator viernes, 23 de septiembre de 2016 16:51