web-dev-qa-db-fra.com

UNION les résultats de plusieurs procédures stockées

J'ai une procédure stockée que je dois appeler plusieurs fois en passant à chaque fois dans différents paramètres. Je voudrais collecter les résultats en un seul ensemble de données. Est-ce que quelque chose comme ça est possible ...

exec MyStoredProcedure 1
UNION
exec MyStoredProcedure 2
UNION
exec MyStoredProcedure 3

J'ai essayé d'utiliser la syntaxe ci-dessus mais j'ai eu l'erreur ...

Incorrect syntax near the keyword 'UNION'

Les procédures stockées que je traite sont assez complexes et une sorte de "boîte noire" pour moi, donc je ne peux pas entrer dans la définition de la procédure stockée et rien changer. Avez-vous des suggestions sur la façon de rassembler les résultats?

J'utilise SQL Server 2008 R2. Merci pour toute aide.

43
webworm

Vous devez utiliser une table temporaire comme celle-ci. UNION est pour les SELECT, pas les proc stockés

CREATE TABLE #foo (bar int ...)

INSERT #foo
exec MyStoredProcedure 1

INSERT #foo
exec MyStoredProcedure 2

INSERT #foo
exec MyStoredProcedure 3

...

Et j'espère que les procs stockés n'ont pas INSERT..EXEC.. déjà qui ne peut pas être imbriqué. Ou plusieurs jeux de résultats. Ou plusieurs autres constructions de rupture

70
gbn

Vous pouvez utiliser INSERT EXEC pour ça.

declare @myRetTab table (somcolumn ...)
insert @myRetTab
exec StoredProcName @param1

Utilisez ensuite l'union sur la ou les variables de table.

11
Ben

Vous pouvez faites tout cela mais pensez à ce que vous demandez ......

Vous voulez passer plusieurs paramètres au sp et lui faire produire le même jeu de résultats de format pour les différents paramètres. Ainsi, vous effectuez en fait une boucle et appelez à plusieurs reprises le proc stocké avec des données scalaires.

Ce que vous devriez faire est de réécrire le sp afin qu'il puisse prendre des ensembles de paramètres et vous fournir un résultat combiné. Ensuite, vous ne faites qu'une seule opération basée sur un ensemble.

Vous pouvez passer des variables de table dans un sp en 2008 tant que vous créez d'abord votre propre type.

4
Transact Charlie

Voici la requête générale

DECLARE @sql nvarchar(MAX)
DECLARE @sql1 nvarchar(MAX)

set @sql = 'select name from abc'

set @sql1 = 'select name from xyz'

EXECUTE(@sql + ' union all ' + @sql1)
2
Vikrant Shitole