sql - usuario - ¿Ejecutar la función de valor de tabla en varias filas?
sintaxis para crear una function en sql (2)
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,'''') <> ''''
Vuelve:
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,'''') <> ''''
Esto tampoco lo hace:
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 la función no pueden hacer referencia a ninguna columna de la consulta externa.
El tipo de conjunto de resultados que estoy buscando serí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 forma (aparte de, por supuesto, un cursor) de lograr esto?
(editar)
Según lo solicitado por MarlonRibunal, 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 varchar(max)
.
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 sé que eso sería mejor que usar un cursor.
OUTER APPLY
:
SELECT Stuff.id
,Results.pn
,Results.s
FROM _454945 AS Stuff
OUTER APPLY dbo.Split('','', Stuff.myColumn) AS Results
WHERE ISNULL(Results.s,'''') <> ''''