2012-08-15 11 views

risposta

79

Questo dipende dalla natura delle informazioni che si desidera tornare.

Se si tratta di un singolo valore integer, è possibile utilizzare il return dichiarazione

create proc myproc 
as 
begin 
    return 1 
end 
go 
declare @i int 
exec @i = myproc 

Se si dispone di un valore intero non, o di un certo numero di valori scalari, è possibile utilizzare i parametri di output

create proc myproc 
    @a int output, 
    @b varchar(50) output 
as 
begin 
    select @a = 1, @b='hello' 
end 
go 
declare @i int, @j varchar(50) 
exec myproc @i output, @j output 

Se si desidera restituire un set di dati, è possibile utilizzare insert exec

create proc myproc 
as 
begin 
    select name from sysobjects 
end 
go 

declare @t table (name varchar(100)) 
insert @t (name) 
exec myproc 

Si può anche restituire un cursore, ma questo è solo orribile, quindi non darò un esempio :)

+9

Per i numeri interi, dovresti comunque utilizzare i parametri di output. Riserva il valore di ritorno per quello che sono stati progettati: stato. I bravi programmatori separano concetti e scrivono codice solido. Cosa succede se la stored procedure che restituisce un intero ha esito negativo? –

+0

ho osservato un'anomalia che quando restituisco un decimale le sue cifre decimali sono zero, ma quando lo cambio per selezionarlo restituisce correttamente le posizioni decimali. – Rama

+2

@DRAM 'return' restituisce un singolo ** intero ** valore – podiluska

7

È possibile utilizzare l'istruzione return all'interno di una stored procedure per restituire un codice di stato intero (e solo di tipo integer). Per convenzione, un valore di ritorno pari a zero viene utilizzato per il successo.

Se non return è impostato in modo esplicito, allora la stored procedure restituisce zero.

CREATE PROCEDURE GetImmediateManager 
     @employeeID INT, 
     @managerID INT OUTPUT 
    AS 
    BEGIN 
    SELECT @managerID = ManagerID 
    FROM HumanResources.Employee 
    WHERE EmployeeID = @employeeID 

    if @@rowcount = 0 -- manager not found? 
     return 1; 
    END 

E si chiama in questo modo:

DECLARE @return_status int; 
DECLARE @managerID int; 

EXEC @return_status = GetImmediateManager 2, @managerID output; 
if @return_status = 1 
    print N'Immediate manager not found!'; 
else 
    print N'ManagerID is ' + @managerID; 
go 

si dovrebbe usare il valore di ritorno solo per codici di stato. Per restituire i dati, è necessario utilizzare i parametri di output.

Se si desidera restituire un set di dati, quindi utilizzare un parametro di output di tipo cursor.

more on RETURN statement

+3

@downvoter, ti dispiace spiegare cosa c'è che non va? –

3

utilizzare questo codice, funziona correttamente

CREATE PROCEDURE [dbo].[sp_delete_item] 
@ItemId int = 0 
@status bit OUT 

AS 
Begin 
DECLARE @cnt int; 
DECLARE @status int =0; 
SET NOCOUNT OFF 
SELECT @cnt =COUNT(Id) from ItemTransaction where ItemId = @ItemId 
if(@cnt = 1) 
    Begin 
    return @status; 
    End 
else 
    Begin 
    SET @status =1; 
    return @status; 
End 
END 

Esegui SP

DECLARE @statuss bit; 
EXECUTE [dbo].[sp_delete_item] 6, @statuss output; 
PRINT @statuss; 
Problemi correlati