¿Ejecutar la función con valor de tabla en varias filas?
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 varios registros", ¿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: {[14]]}
SELECT * FROM dbo.Split_temp(',', myColumn), Stuff
Los documentos dicen:
Cuando se invoca una función definida por el usuario que devuelve una tabla en la cláusula FROM de una subconsulta, los argumentos de 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 algo así como:
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 manera (aparte, por supuesto, de un cursor) de lograr esto?
(editar)
Según lo solicitado por MarlonRibunal, una tabla de muestra para producir el resultado anterior se ve como:
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)
.
2 answers
OUTER APPLY
:
SELECT Stuff.id
,Results.pn
,Results.s
FROM stackoverflow_454945 AS Stuff
OUTER APPLY dbo.Split(',', Stuff.myColumn) AS Results
WHERE ISNULL(Results.s,'') <> ''
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-01-18 13:37:00
Podría 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 se si eso sería mejor que usar un cursor.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-01-18 11:26:06