2009-01-18 26 views
31

Dada una función con valores de tabla como dbo.Split() desde "T-SQL: Opposite to string concatenation - how to split string into multiple records", ¿cómo paso varias filas como argumentos?¿Ejecuta la función de valor de tabla en varias filas?

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 es así:

SELECT * 
FROM dbo.Split 
    (',', (SELECT myColumn FROM Stuff)) 
WHERE ISNULL(s,'') <> '' 

Tampoco hace esto:

SELECT * FROM dbo.Split_temp(',', myColumn), Stuff 

The docs 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 puede hacer referencia las columnas de la consulta externa.

El tipo de conjunto de resultados Busco sería algo 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 para nada (aparte de, por supuesto, un cursor) para lograr esto?

(edit)

lo solicitado por MarlonRibunal, una tabla de ejemplo 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).

Respuesta

48

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,'') <> '' 
+0

¡Impresionante! El segundo "FROM Stuff" fue marcado como un error de sintaxis, pero después de eliminarlo, la declaración hizo exactamente lo que yo quería. Gracias. –

+0

Bien, dejé eso en mi copia/pega - He probado y corregido el código aquí. –

+0

¿Por qué usar 'isnull (Results.s, '') <> ''' cuando 'Results.s no es nulo' también funciona y es mucho más escueto? – tgandrews

0

podría utilizar 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 usando un cursor.

+0

AIUI, que no sería retener el id de la fila respectiva, sólo el valor. –

Cuestiones relacionadas