2012-08-15 14 views

Odpowiedz

79

To zależy od charakteru informacji, które chcesz wrócić.

Jeśli jest to pojedyncza wartość całkowitą, można użyć instrukcji

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

return Jeśli masz non wartość całkowitą lub szereg wartości skalarnych, można użyć parametrów wyjściowych

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 

Jeśli chcesz powrócić zestawu danych, można użyć insert exec

create proc myproc 
as 
begin 
    select name from sysobjects 
end 
go 

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

Można nawet wrócić kursor ale to po prostu okropny, więc nie powinien dać przykład :)

+9

Dla liczb całkowitych należy nadal używać parametrów wyjściowych. Zarezerwuj wartość zwrotu dla tego, co zostało zaprojektowane: status. Dobrzy programiści oddzielają pojęcia i piszą solidny kod. Co się dzieje, jeśli procedura składowana zwracająca liczbę całkowitą kończy się niepowodzeniem? –

+0

Zauważyłem anomalię, że gdy zwrócę dziesiętny, jej miejsca po przecinku są zerowe, ale kiedy zmieniam je, aby wybrać, zwraca poprawnie miejsca dziesiętne. – Rama

+2

@DRAM 'return' zwraca pojedynczą ** liczbę całkowitą ** wartość – podiluska

7

Możesz użyć instrukcji return w procedurze przechowywanej, aby zwrócić kod statusu całkowitoliczbowego (i tylko typ całkowity). Zgodnie z konwencją do sukcesu odnosi się wartość zerową.

Jeśli nie zostanie ustawione jednoznacznie return, procedura składowana zwraca 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 

I ty nazywasz to w ten sposób:

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 

Należy używać wartości zwracanej przez zaledwie kodów stanu. Aby zwrócić dane, należy użyć parametrów wyjściowych.

Jeśli chcesz zwrócić zestaw danych, użyj parametru wyjściowego typu cursor.

more on RETURN statement

+3

@downvoter, czy możesz wyjaśnić, co jest nie tak? –

3

użyć tego kodu, prawidłowo

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 

Praca Execute SP

DECLARE @statuss bit; 
EXECUTE [dbo].[sp_delete_item] 6, @statuss output; 
PRINT @statuss; 
Powiązane problemy