2010-02-11 22 views
60

Làm thế nào để bạn chỉ định kết quả của một cuộc gọi exec đến một biến trong SQL? Tôi có một proc được lưu trữ được gọi là up_GetBusinessDay, trả về một ngày duy nhất.Làm thế nào để gán một kết quả exec cho một biến sql?

Bạn có thể làm điều gì đó như thế này:

exec @PreviousBusinessDay = dbo.up_GetBusinessDay @Date, -1 
+3

là điều này cho SQL Server? mã của bạn trông giống như TSQL. Nếu có, bạn sẽ nhận được nhiều lượt xem và câu trả lời hơn nếu bạn gắn thẻ "sql-server" –

Trả lời

59

Tôi luôn sử dụng giá trị trả về để trả lại trạng thái lỗi. Nếu bạn cần phải trả lại một giá trị tôi muốn sử dụng một tham số đầu ra.

mẫu thủ tục lưu trữ, với một tham số OUTPUT:

CREATE PROCEDURE YourStoredProcedure 
(
    @Param1 int 
    ,@Param2 varchar(5) 
    ,@Param3 datetime OUTPUT 
) 
AS 
IF ISNULL(@Param1,0)>5 
BEGIN 
    SET @Param3=GETDATE() 
END 
ELSE 
BEGIN 
    SET @Param3='1/1/2010' 
END 
RETURN 0 
GO 

cuộc gọi đến thủ tục lưu trữ, với một tham số OUTPUT:

DECLARE @OutputParameter datetime 
     ,@ReturnValue  int 

EXEC @ReturnValue=YourStoredProcedure 1,null, @OutputParameter OUTPUT 
PRINT @ReturnValue 
PRINT CONVERT(char(23),@OutputParameter ,121) 

OUTPUT:

0 
2010-01-01 00:00:00.000 
+7

Bằng cách sử dụng tham số OUTPUT, bạn có thể trả về bất kỳ kiểu dữ liệu nào, giá trị RETURN từ một thủ tục được lưu trữ chỉ có thể là một số nguyên. –

+0

+1: Đồng ý, cảm ơn nhận xét của bạn. –

+1

Chỉ cần một lưu ý phụ, các tham số OUTPUT được khai báo với một giá trị không cần phải được thông qua. Điều này có nghĩa là nếu bạn đang thay đổi SP hiện tại, bạn có thể thực hiện nó một cách an toàn mà không sợ phá vỡ bất kỳ thứ gì. ví dụ: @ Param3 datetime = '1900-01-01' OUTPUT. – Morvael

5

Từ documentation (giả định rằng bạn sử dụng SQL Server):

USE AdventureWorks; 
GO 
DECLARE @returnstatus nvarchar(15); 
SET @returnstatus = NULL; 
EXEC @returnstatus = dbo.ufnGetSalesOrderStatusText @Status = 2; 
PRINT @returnstatus; 
GO 

Vì vậy, vâng, nó sẽ hoạt động theo cách đó.

+7

trong ví dụ của OP mà họ muốn trả lại ngày, Quy trình được lưu trữ chỉ có thể RETURN giá trị số nguyên cho quy trình gọi hoặc ứng dụng. –

34

này sẽ làm việc nếu bạn chỉ muốn trả về một số nguyên:

DECLARE @ResultForPos INT 
EXEC @ResultForPos = storedprocedureName 'InputParameter' 
SELECT @ResultForPos 
+8

-1 Điều này sẽ chỉ trả lại một số nguyên. OP muốn trả lại một ngày. Câu trả lời được chấp nhận bởi @KM. là câu trả lời đúng, vì nó sử dụng OUTPUT thay vì RETURN. –

+3

Thực ra công trình này hoạt động. Ví dụ như làm thế nào để có được một số nguyên được trả về, bạn có thể làm tương tự cho tất cả các loại khác (không kiểm tra xem bảng có thể, nhưng tôi nghĩ có.) Tôi chỉ thử nó cho nvarchar (50). – Mzn

+1

@ Mzn * "bạn có thể làm tương tự cho tất cả các loại khác" *, chắc chắn không hoạt động với 'UNIQUEIDENTIFIER'. – James

20
declare @EventId int 

CREATE TABLE #EventId (EventId int) 

insert into #EventId exec rptInputEventId 

set @EventId = (select * from #EventId) 

drop table #EventId 
+2

thực sự là cách làm việc duy nhất được giải mã ở đây ngoài việc thay đổi chữ ký của proc được lưu trữ –

+1

Được sử dụng này cũng cho một ngày, khi Sproc cơ bản không có tham số đầu ra. (Sproc nằm bên dưới có Exec khác bên trong nó từ SQL động) –

+2

@MichaelSander Hoàn toàn đúng, tất cả các giải pháp khác là ** không ** trả lời đúng câu hỏi OPs. Cách duy nhất là một bảng tạm thời chứa kết quả. –

Các vấn đề liên quan