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

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top