2010-10-06 9 views
11

J'ai besoin d'un SP pour renvoyer plusieurs ensembles de résultats. Le deuxième ensemble de résultats serait basé sur une colonne du premier ensemble de résultats.Procédure stockée renvoyer plusieurs ensembles de résultats

Alors:

declare @myTable1 table(field0 int,field1 varchar(255)) 
insert into @myTable1 select top 1 field0, field1 from table1 

declare @myTable2 table(field0 int,field3 varchar(255)) 
insert into @myTable2 
select field0, field3 from table2 
where @myTable1.field0 = @myTable2.field0 

Comment revenir @ myTable1 et @ myTable2 avec mon SP? Cette syntaxe est-elle correcte?

Mes excuses, je suis un débutant à SQL ...

EDIT:

Alors, je me fais une erreur sur la dernière ligne du code ci-dessous qui dit: " doit déclarer la variable scalaire « @ myTable1 » »

declare @myTable1 table(field0 int,field1 dateTime) 
insert into @myTable1 
select top 1 field0, field1 
from someTable1 m 
where m.field4 > 6/29/2009 

select * from @myTable1 
select * 
from someTable2 m2 
where m2.field0 = @myTable1.field0 

Si je souligne et exécutez le haut de code jusqu'à ce que la seconde select * il fonctionne très bien ... quand je souligne le reste, il agit comme la première variable ne existe ...

EDIT2: Résolu ce problème. Merci les gars.

declare @myTable1 table(field0 int,field1 dateTime) 
insert into @myTable1 
select top 1 field0, field1 
from someTable1 m 
where m.field4 > 6/29/2009 

select * from @myTable1 
select * 
from someTable2 m2 
where m2.field0 = (select field0 from @myTable1) 
+0

Vous auriez dû demander avant, mais quel RDBMS utilisez-vous? – JNK

+0

Cela ne fonctionnera pas si vous n'avez pas le DECLARE @ Mytable1 dans la même déclaration. Si vous venez de mettre en évidence la dernière partie, la DECLARE n'est pas dans cette requête. ces variables ne sont bonnes que pour une requête et ne persistent pas. – JNK

+0

Microsoft SQL Server 2005 – EJC

Répondre

20

Vous à peu près juste sélectionner deux ensembles de résultats

SELECT * FROM @myTable1 
SELECT * FROM @myTable2 

Cependant, certains outils cacheront des résultats (par exemple pgAdmin ne montrera que le dernier) et certains outils ont une sorte d'obligation d'obtenir au résultat suivant set (par exemple. IDataReader de .NET ne vous permettra pas de Read() à partir du second resultset jusqu'à ce que vous appelez NextResult()).

Edit:

Une alternative dans ce cas, étant donné que les types de deux résultats correspondent, est de les combiner en un seul ResultSet:

SELECT field0, field1 from @myTable1 
UNION 
SELECT field0, field3 from @myTable2 

Vous pouvez également choisir entre UNION ALL ou UNION DISTINCT (la valeur par défaut) où ce dernier n'enverra que des lignes qui ne sont pas répétées.

+0

Bon point! Je n'ai pas abordé cela puisqu'il n'a pas mentionné la demande d'appel. – JNK

+0

@JNK, c'est exactement la même raison que je * l'ai * mentionnée, en me demandant pourquoi ils avaient eu des problèmes pour l'essayer. Je me demandais si ils le faisaient déjà bien, mais leurs outils les cachent. –

+0

Les résultats de cette requête seront envoyés par e-mail au format HTML à partir d'une application C# ... Cette approche fonctionnera toujours? Je n'ai pas regardé trop profondément dans l'application qui appelle le SP, je sais juste qu'il peut appeler un SP pour obtenir des résultats et un autre programme enverra les résultats par e-mail. – EJC

4

A la fin de la procédure stockée, mis:

SELECT * FROM @myTable1 
SELECT * FROM @myTable2 

Cela renverra 2 jeux de résultats.

+0

Excellent Je vais essayer cela sous peu :) – EJC

+0

Gardez à l'esprit que vous obtiendrez réellement TROIS jeux de résultats, car il semble que vous en ayez un parmi les select à la fin de votre code dans l'OP. – JNK

+0

Cela ne fonctionne pas ... Je reçois un message d'erreur, "doit déclarer la variable scalaire @ myTable1" en faisant la clause where "Où @ myTable1.field0 = @ myTable2.field0" des pensées? – EJC

Questions connexes