Una imagen podría ayudar a entender mejor lo que se quiere hacer.
Una cadena de Instrumentos:
Una cadena a varias filas
para pasar una cadena a varias filas como primer paso la cadena debe ser convertida a un XML, Hagamos un ejemplo con una cadena en una variable...
DECLARE @STR_INSTRUMENTOS VARCHAR (500)
DECLARE @XML_INSTRUMENTOS XML
la primer variable tendrá el texto con información separada por comas
la segunda variable es un tipo de dato XML donde se vaciará el texto ya separado
la segunda variable es un tipo de dato XML donde se vaciará el texto ya separado
SET @STR_INSTRUMENTOS = 'IPA BONOS IM, IPA BONOS IP, IPA BONOS IQ, IPA BONOS IS, IPA
BONOS IT';
-- PARA COVERTIR A XML
SET @XML_INSTRUMENTOS = CAST(('<Instrumento>' + replace(@STR_INSTRUMENTOS,',','</Instrumento><Instrumento>')+'</Instrumento>') AS XML)
Al revisar la variable, vemos que ya contiene la separación en un formato XML
SELECT @XML_INSTRUMENTOS
Dentro del visor del XML se puede ver el formato del XML
Ahora lo único que se debe hacer es convertir el XML en Table,
es muy fácil, si quieres más detalle aquí te dejo un link XML to TABLE
SELECT
A.value ('text()[1]','varchar(30)') as Instrumentos
FROM
@XML_INSTRUMENTOS.nodes
('//Instrumento') as T(A)
EJEMPLO COMPLETO:
DECLARE @STR_INSTRUMENTOS VARCHAR (500)
DECLARE @XML_INSTRUMENTOS XML
SET @STR_INSTRUMENTOS = 'IPA BONOS IM, IPA BONOS IP, IPA BONOS IQ, IPA BONOS IS, IPA
BONOS IT';
-- PARA COVERTIR A XML
SET @XML_INSTRUMENTOS = CAST(('<Instrumento>'+replace(@STR_INSTRUMENTOS,',','</Instrumento><Instrumento>')+'</Instrumento>') AS XML)
SELECT
A.value ('.','varchar(30)') as Instrumentos
FROM
@XML_INSTRUMENTOS.nodes
('Instrumento') as T1(A)
EJEMPLO 2
En éste ejemplo se van a separar en filas las columnas:
- ASOCIATE_INSTRUMENT
de la tabla que se muestra a continuación
Donde podemos ver que ya se tiene el XML a un lado de esa columa
ESTA ES LA CONSULTA DE LA TABLA SUPERIOR
SELECT
[CLIENT_ID]
,[ASOCIATE_INSTRUMENT]
,INSTRUMENTS = cast(('<IdItem>' + replace([ASOCIATE_INSTRUMENT],',','</IdItem><IdItem>') + '</IdItem>') AS XML)
,[INITIAL_AMOUNT_A]
,[FINAL_AMOUNT_A]
,[RATE_A]
,[TOTAL_FEE]
INTO #TEMP
FROM [Avispa].[Avispa].[TARIFAS_COMISION_ACUMULADA]
LA CONSULTA SE METE EN UNA TABLA TEMPORAL, PARA POSTERIORMENTE EXTRAER UNA CONSULTA..-
El query anterior ya nos entrega los registros
SELECT T2.Instruments,T1.*
FROM
#TEMP AS
T1
CROSS
APPLY (
SELECT A.value ('text()[1]','varchar(30)') as Instruments
FROM T1.INSTRUMENTS.nodes ('IdItem') as T(A)
) AS T2