¿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).

Author: Community, 2009-01-18

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,'') <> ''
 50
Author: Cade Roux,
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.

 0
Author: cmsjr,
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