2010-10-06 11 views
11

Ich brauche einen SP, um mehrere Ergebnismengen zurückzugeben. Die zweite Reihe von Ergebnissen würde auf einer Spalte der ersten Reihe von Ergebnissen basieren.Stored Procedure gibt mehrere Ergebnismengen zurück

So:

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 

Wie Rückkehr @ myTable1 und @ myTable2 mit meinem SP? Ist diese Syntax überhaupt richtig?

Ich entschuldige mich, ich bin immer noch ein Neuling in SQL ...

EDIT:

Also, ich bin so unter, dass in der letzten Zeile des Codes einen Fehler bekommen: " muss die skalare Variable „@ 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 

erklären Wenn ich den Code bis zum zweiten select * es funktioniert gut markieren und laufen ... wenn ich den Rest markieren sie die erste Variable wirkt wie nicht exist ...

EDIT2: Dieses Problem festgestellt. Danke Leute.

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

Sollten Sie vorher gefragt haben, aber welche RDBMS verwenden Sie? – JNK

+0

Es funktioniert nicht, wenn Sie DECLARE @ Mytable1 nicht in derselben Anweisung haben. Wenn Sie nur den letzten Teil markieren, befindet sich DECLARE nicht in dieser Abfrage. Diese Variablen sind nur für eine Abfrage geeignet und werden nicht beibehalten. – JNK

+0

Microsoft SQL Server 2005 – EJC

Antwort

20

Sie ziemlich wählen nur zwei Ergebnis

SELECT * FROM @myTable1 
SELECT * FROM @myTable2 

Allerdings setzt, werden einige Tools einige Ergebnisse verstecken (zB pgAdmin wird nur die letzte Show) und einige Werkzeuge haben eine Art von Anforderung zum nächsten Ergebnis zu erhalten set (zB .NET's IDataReader's erlaubt Ihnen nicht Read() von der zweiten Ergebnismenge bis Sie NextResult() anrufen).

Edit:

Eine Alternative in diesem Fall, da die Arten der beiden Ergebnisse übereinstimmen, ist, sie in einem einzigen Suchresultates zu kombinieren:

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

Sie können auch zwischen UNION ALL oder UNION DISTINCT wählen (der Standardwert), wobei letzterer nur Zeilen sendet, die keine Wiederholungen sind.

+0

Guter Punkt! Ich habe das nicht angesprochen, da er den Anrufungsantrag nicht erwähnt hat. – JNK

+0

@JNK, lol, das ist genau der gleiche Grund, warum ich es erwähnt habe, als ich mich gefragt habe, warum sie Probleme damit hatten, fragte ich mich, ob sie es vielleicht schon gut machten, aber ihre Werkzeuge verstecken es vor ihnen. –

+0

Die Ergebnisse dieser Abfrage werden per E-Mail im HTML-Format von einer C# -Anwendung gesendet ... Dieser Ansatz funktioniert noch? Ich habe nicht zu tief in die Anwendung geschaut, die den SP aufruft, ich weiß nur, dass es einen SP aufrufen kann, um einige Ergebnisse zu erhalten, und dann sendet ein anderes Programm die Ergebnisse. – EJC

4

Am Ende des Stored Proc, setzen:

SELECT * FROM @myTable1 
SELECT * FROM @myTable2 

wird 2 Resultsets Diese zurückzukehren.

+0

Excellent Ich werde das in Kürze versuchen :) – EJC

+0

Bedenke, dass du tatsächlich drei Ergebnissätze bekommst, da es aussieht, als hättest du einen aus der Auswahl am Ende deines Codes im OP. – JNK

+0

Das funktioniert nicht ... Ich bekomme eine Fehlermeldung, "muss die Skalarvariable @ myTable1 deklarieren", wenn ich die where-Klausel "wo @ myTable1.field0 = @ myTable2.field0" irgendwelche Gedanken mache? – EJC