2012-09-13 8 views
5

Ho una stored procedure che calcola diversi valori e SELECT li S:Come si usa il risultato di SELECT in una stored procedure in un'altra procedura con mirroring?

CREATE PROCEDURE [dbo].[MyProc] 
AS 
    DECLARE @value1 int; 
    DECLARE @value2 int; 
    SET @value1 =... 
    IF(@value1 IS NULL) 
     RETURN 0; 
    SET @value2 =... 
    SELECT @value1 AS Value1, @value2 AS Value2; 
RETURN 0; 

so che posso trasformarla in una funzione di tabella, ma preferisco non farlo a causa della RETURN nel mezzo - a volte non c'è solo nulla da restituire.

Voglio chiamare quella stored procedure da un'altra stored procedure e utilizzare i valori recuperati da SELECT nell'altra procedura. Come lo faccio?

+0

duplicato di http://stackoverflow.com/questions/1184325/how-to-call-a-stored-procedure-from-another-stored-procedure – Jodrell

+0

duplicato di http://stackoverflow.com/questions/3039200/tsql-call-a-stored-procedure-from-another-stored-procedure-and-read-the-result – Jodrell

+0

prima di coprire il vecchio dominio TSQL, si dovrebbe sempre controllare questo sito http://www.sommarskog.se/share_data .html – Jodrell

risposta

2

È possibile creare un tentatore e inserire entrambi i valori.

CREATE TABLE #Temp (value1 int, value2 int) 

INSERT INTO #Temp (value1, value2) 
EXEC [dbo].[MyProc] 

Se Value1 è NULL non ci saranno record nel #Temp, e in questo caso non c'è bisogno del ritorno 0.

Ma se non è il vostro obiettivo, ed è necessario restituire 0 , quindi è necessario utilizzare @ value1 e @ value2 come parametri di output.

+0

Posso controllare quale colonna dal 'SELECT' va in quale colonna della tabella? – sharptooth

+0

Sì, ma solo se il numero di colonne e i tipi corrispondono. Come INSERT INTO #Temp (valore1, valore2) e INSERT INTO #Temp (valore2, valore1) è anche possibile.Ma non puoi scrivere una selezione sulla tua istruzione EXEC .... L'ordine di reso dalla stored procedure è definito lì. –

+0

Questa risposta è molto utile, aggiungerò semplicemente che una variabile di tabella può essere usata al posto di un temptable. – sharptooth

2

È possibile aggiungere parametri di uscita:

CREATE PROCEDURE [dbo].[MyProc] 
(
    @value1 int = null output, 
    @value2 int = null output 
) 
AS 

    SET @value1 =... 
    IF(@value1 IS NULL) 
     RETURN 0; 
    SET @value2 =... 
    SELECT @value1 = Value1, 
      @value2 = Value2; 
RETURN 0; 

e usarlo:

declare @v1 int, 
     @v2 int 

exec MyProc @v1 out, @v2 out 

select @v1, @v2 

o se avete bisogno di più valori è possibile utilizzare tabella temporanea

create table #tmp 
(
    val1 int null, 
    val2 int null 
) 

CREATE PROCEDURE [dbo].[MyProc] 
AS 

    SET @value1 =... 
    IF(@value1 IS NULL) 
     RETURN 0; 
    SET @value2 =... 

    insert into #tmp 
    SELECT Value1, Value2 
    from tab 

RETURN 0; 

e usarlo:

create table #tmp 
(
    val1 int null, 
    val2 int null 
) 

exec MyProc 

select * 
from #tmp 

drop table #tmp 
+0

Si consiglia di modificare il ritorno 0 alla fine di myproc su 1. È quindi possibile eseguire (nel processo memorizzato di chiamata) 'DECLARE @Exists bit; exec @Exists = MyProc; Se @Exists ... Else ... 'consente solo di verificare se il valore 1 era nullo senza utilizzare un conteggio sul temp e roba – Manatherin

+0

Sì, certo, ma volevo mostrare come prendere valori, nient'altro. – Parado

Problemi correlati