¿Ejecutar la función con valores de tabla en varias filas?
-
19-08-2019 - |
Pregunta
Dada una función con valores de tabla como dbo.Split ()
de " T-SQL: Opuesto a la concatenación de cadenas - cómo dividir cadenas en registros múltiples " , ¿cómo paso varias filas como argumentos? ?
Esto funciona:
SELECT *
FROM dbo.Split
(',', (SELECT myColumn FROM Stuff WHERE id = 22268))
WHERE ISNULL(s,'') <> ''
Devuelve:
pn s
----------- -----------
1 22351
2 22354
3 22356
4 22357
5 22360
Pero esto no:
SELECT *
FROM dbo.Split
(',', (SELECT myColumn FROM Stuff))
WHERE ISNULL(s,'') <> ''
Tampoco esto:
SELECT * FROM dbo.Split_temp(',', myColumn), Stuff
Los documentos dicen:
Cuando una función definida por el usuario que devuelve una tabla se invoca en la cláusula FROM de una subconsulta, los argumentos de la función no pueden hacer referencia a ninguna columna de la consulta externa.
El tipo de conjunto de resultados que estoy buscando se vería así:
id pn s
----------- ----------- -----------
22268 1 22351
22268 2 22354
22268 3 22356
22268 4 22357
22268 5 22360
24104 1 22353
24104 2 22355
24104 3 22356
24104 4 22358
24104 5 22360
24104 6 22362
24104 7 22364
.
.
.
¿Hay alguna forma (aparte de, por supuesto, un cursor) para lograr esto?
(editar)
Según lo solicitado por MarlonR tribunal, una tabla de muestra para producir el resultado anterior se ve así:
id myColumn
----------- -------------------------------------------
22268 22351,22354,22356,22357,22360,
24104 22353,22355,22356,22358,22360,22362,22364,
id
es un int
; myColumn
es un varchar (max)
.
Solución
APLICACIÓN EXTERNA
:
SELECT Stuff.id
,Results.pn
,Results.s
FROM stackoverflow_454945 AS Stuff
OUTER APPLY dbo.Split(',', Stuff.myColumn) AS Results
WHERE ISNULL(Results.s,'') <> ''
Otros consejos
Puede usar el comportamiento de concatenación COALESCE
declare @split varchar(max)
set @split = ''
select @split = @split + Coalesce(myColumn + ',' , ' ')
from Stuff
WHERE id = 22268
select * from dbo.Split(',', @Left(@split,len(@split) -1))
No sé que eso sería mejor que usar un cursor.