2010-10-06 1 views
11

Ho bisogno di un SP per restituire più serie di risultati. La seconda serie di risultati si baserà su una colonna del primo insieme di risultati.stored procedure restituisce più set di risultati

Quindi:

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 

Come tornare @ myTable1 e @ myTable2 con il mio SP? La sintassi è addirittura corretta?

Le mie scuse, io sono ancora un novizio in SQL ...

EDIT:

Quindi, sto ricevendo un errore sull'ultima riga del codice qui sotto che dice: " deve dichiarare la variabile scalare "@ 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 

Se evidenzio ed eseguire il codice fino al secondo select * che funziona bene ... quando evidenzio il resto si comporta come la prima variabile non lo faesiste ...

EDIT2: Calcolato questo problema. Grazie ragazzi.

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

Avrebbe dovuto chiedere prima, ma quale RDBMS stai usando? – JNK

+0

Non funzionerà se non hai DECLARE @ Mytable1 nella stessa istruzione. Se si evidenzia solo l'ultima parte, DECLARE non è in quella query. queste variabili sono valide solo per una query e non persistono. – JNK

+0

Microsoft SQL Server 2005 – EJC

risposta

20

È praticamente solo selezionare due set di risultati

SELECT * FROM @myTable1 
SELECT * FROM @myTable2 

Tuttavia, alcuni strumenti saranno nascondere alcuni risultati (ad esempio pgAdmin mostrerà solo l'ultimo) e alcuni strumenti hanno una sorta di obbligo di arrivare al risultato successivo set (ad esempio, IDataReader di .NET non consente di eseguire Read() dal secondo set di risultati finché non si chiama NextResult()).

Edit:

Un'alternativa in questo caso, dal momento che i tipi della partita due risultati, è quello di riunire in un unico gruppo di risultati:

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

si può anche scegliere tra UNION ALL o UNION DISTINCT (il valore predefinito) dove quest'ultimo invierà solo righe che non sono ripetizioni.

+0

Buon punto! Non ho affrontato questo dato che non ha menzionato l'applicazione chiamante. – JNK

+0

@ JNK, lol è esattamente la stessa ragione per cui * l'ho * menzionato, nel chiedermi perché avevano avuto problemi nel provarlo, mi chiedevo se forse lo stavano già facendo bene, ma i loro strumenti lo nascondevano da loro. –

+0

I risultati di questa query verranno inviati via email in formato HTML da un'applicazione C# ... Questo approccio funzionerà ancora? Non ho guardato troppo in profondità nell'applicazione che chiama l'SP, so solo che può chiamare un SP per ottenere dei risultati e poi un altro programma invierà i risultati via e-mail. – EJC

4

Alla fine del proc memorizzato, messo:

SELECT * FROM @myTable1 
SELECT * FROM @myTable2 

Questo torneranno 2 set di risultati.

+0

Eccellente Proverò a breve :) – EJC

+0

Tieni presente che in effetti otterrai TRE set di risultati, dal momento che sembra che ne abbia uno dalla selezione alla fine del codice nell'OP. – JNK

+0

Questo non funziona ... Viene visualizzato un messaggio di errore, "deve dichiarare la variabile scalare @ myTable1" quando si fa la clausola where "where @ myTable1.field0 = @ myTable2.field0" qualche idea? – EJC