2012-08-15 41 views

Trả lời

79

Điều đó tùy thuộc vào bản chất của thông tin bạn muốn trả lại.

Nếu nó là một giá trị số nguyên duy nhất, bạn có thể sử dụng return tuyên bố

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

Nếu bạn có một giá trị số nguyên không, hoặc một số giá trị vô hướng, bạn có thể sử dụng các thông số đầu ra

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 

Nếu bạn muốn trả lại một tập dữ liệu, bạn có thể sử dụng insert exec

create proc myproc 
as 
begin 
    select name from sysobjects 
end 
go 

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

Bạn thậm chí có thể trả về một con trỏ nhưng đó chỉ là kinh khủng vì vậy tôi sẽ không đưa ra một ví dụ :)

+9

Đối với số nguyên, bạn vẫn nên sử dụng tham số đầu ra. Giá trị trả về dự trữ cho những gì chúng được thiết kế: trạng thái. Lập trình tốt các khái niệm riêng biệt và viết mã vững chắc. Điều gì sẽ xảy ra nếu thủ tục lưu trữ của bạn trả về một số nguyên xảy ra thất bại? –

+0

tôi đã quan sát thấy một sự bất thường khi tôi trả về một số thập phân vị trí thập phân của nó là số không nhưng khi tôi thay đổi nó để chọn nó trả về số thập phân một cách chính xác. – Rama

+2

@DRAM 'return' trả về một ** số nguyên ** giá trị – podiluska

7

Bạn có thể sử dụng câu lệnh return bên trong một thủ tục được lưu trữ để trả về mã trạng thái số nguyên (và chỉ có kiểu số nguyên). Theo quy ước, giá trị trả về bằng 0 được sử dụng để thành công.

Nếu không có return được đặt rõ ràng, thì thủ tục được lưu sẽ trả về 0.

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 

Và bạn gọi nó theo cách này:

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 

Bạn nên sử dụng giá trị trả về cho chỉ mã trạng thái. Để trả về dữ liệu, bạn nên sử dụng tham số đầu ra.

Nếu bạn muốn trả lại tập dữ liệu, hãy sử dụng thông số đầu ra loại cursor.

more on RETURN statement

+3

@downvoter, bạn có phiền để giải thích điều gì sai? –

3

Sử dụng mã này, làm việc đúng cách

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 

Execute SP

DECLARE @statuss bit; 
EXECUTE [dbo].[sp_delete_item] 6, @statuss output; 
PRINT @statuss; 
Các vấn đề liên quan