28 votes

Exécuter une fonction table sur plusieurs lignes?

Étant donné une fonction table comme dbo.Split() de "T-SQL: Face à la concaténation de chaîne - comment scinde une chaîne en plusieurs enregistrements", comment puis-je passer plusieurs lignes comme arguments?

Ceci fonctionne:

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

Il retourne:

pn          s
----------- -----------
1           22351
2           22354
3           22356
4           22357
5           22360

Mais ce n'est pas:

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

Ni ce:

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

Les docs disent:

Lorsqu'une fonction définie par l'utilisateur qui renvoie un tableau est invoquée dans la clause from d'une sous-requête, les arguments de la fonction ne peut pas référencer toutes les colonnes de la requête externe.

Le tri de l'ensemble de résultats, je suis à la recherche d'ressemblerait à quelque chose comme:

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

Est-il possible à tous (à part, bien sûr, un curseur) pour accomplir cette?

(edit)

Comme demandé par MarlonRibunal, un exemple de tableau pour produire le résultat ci-dessus ressemble à:

id          myColumn
----------- -------------------------------------------
22268       22351,22354,22356,22357,22360,
24104       22353,22355,22356,22358,22360,22362,22364,

id est int; myColumn est varchar(max).

42voto

Cade Roux Points 53870

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

0voto

cmsjr Points 16766

Vous pouvez utiliser le comportement de concaténation 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))
 

Je ne sais pas que ce serait mieux que d'utiliser un curseur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X