2009-02-20 12 views
6

Ho una stored procedure che restituisce un valore. Richiamarlo da altre stored procedure che devono recuperare questo valore. La stored procedure di chiamata si trova all'interno di una transazione, la stored procedure che restituisce il valore (e crea effettivamente il valore e lo memorizza in una tabella che nessun altro proc tocca) non è all'interno della propria transazione, ma farebbe parte della transazione del chiamante.Qual è il modo migliore per assegnare il valore restituito di un processo memorizzato a una variabile in SQL?

La domanda è questa, qual è il modo più efficace per recuperare il valore di ritorno della stored procedure e la memorizzazione in una variabile nel proc chiamata?

Attualmente ho il seguente e mi chiedo se è molto inefficiente?

DECLARE @tmpNewValue TABLE (newvalue int) 
INSERT INTO @tmpNewValue EXEC GetMyValue 

DECLARE @localVariable int 
SET @localVariable = (SELECT TOP 1 newvalue FROM @tmpNewValue) 

Non c'è un modo più semplice per farlo? Non è un modo costoso (in termini di prestazioni)?

mio proc memorizzato non ha un parametro di uscita, solo restituisce un valore. Usare un parametro di uscita sarebbe più veloce?

Per quello che vale sto usando MS SQL Server 2005

risposta

13

Se vostro ottenere una variabile di ritorno singolo allora sì questo è innefficent si può fare:

declare @localVariable int 
exec @localVariable =GetMyValue 
select @localVariable 
+0

Interessante, non sapeva che era valido costrutto. Quindi l'esempio che ho dato è la creazione di una tabella temporanea. Quanto sarebbe inefficiente descriverlo, molto o non sarebbe evidente se non fosse chiamato decine di migliaia di volte? – ApplePieIsGood

+0

difficile da dire, la tua tabella è una variabile di tabella quindi dovrebbe essere tutto in memoria. Perché non eseguire un test sul tuo sistema per misurare la differenza tra i due? – JoshBerke

1

È questo proc restituire un set di righe di 1 riga e 1 colonna o nessun set di righe e vuoi solo catturare il codice di ritorno?

Se si desidera solo il returncode quindi utilizzare il metodo di Josh altrimenti utilizzare un parametro OUTPUT sicne sarà molto più veloce di quello che stai facendo ora

di spiegare cosa intendo eseguire questo codice

use tempdb 
go 

create proc GetMyValue 
as 
select 1 
go 


create table #temp (id int) 
declare @localVariable int 

insert #temp 
exec @localVariable =GetMyValue 
select @localVariable,* from #temp 
3

vedere How to Share Data Between Stored Procedures
da 'exec = @localVariable GetMyValue' alcuni motivi non funziona per me (MS SQL 2005), è sempre restituire il valore 0 (They have the same issue).

La mia opinione è:
se è possibile modificare la procedura memorizzata, aggiungere parametro di uscita.
altro se è possibile rimuovere la procedura, riscriverla come una funzione.
altrimenti usa la variabile di tabella, come fai tu.

+1

Sarà sempre 0 se non si ha un ritorno nel proc o si verifica un errore, eseguire il codice fornito – SQLMenace

+0

Sono interessato solo a un valore restituito. Usare il metodo di Josh sarà più lento o più veloce di un parametro di uscita quando tutto ciò che voglio è ottenere quel valore di ritorno o un valore specifico (non deve essere un valore di ritorno, ma solo un valore che ho creato all'interno di questo proc). Sembra che sia più veloce che sto facendo attualmente. – ApplePieIsGood

+0

2SQLMenace - sì, hai ragione. funziona con il ritorno. –

0

Prova questo:

create proc AvilableSeats 
as 
declare @v1 int,@v2 int 
exec @v1= determinPath_Capacity 1,'Sat-Tue',32 
exec @v2=Student_fGroup '6/12/2009' 
select @[email protected] 
Problemi correlati