Làm cách nào để gán một kết quả thực thi cho một biến sql?


108

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

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

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

Câu trả lời:


97

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

quy trình lưu trữ mẫu, với 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

gọi thủ tục đã lưu trữ, với tham số OUTPUT:

DECLARE @OutputParameter  datetime
       ,@ReturnValue      int

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

ĐẦU RA:

0
2010-01-01 00:00:00.000

10
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.
KM.

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

55

Điều này sẽ hoạt động nếu bạn chỉ muốn trả về một số nguyên:

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

13
-1 Điều này sẽ chỉ trả về 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 chính xác, vì nó sử dụng OUTPUT thay vì RETURN.
Mã Maverick

4
Trên thực tế điều này hoạt động. Ví dụ về cách lấy 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ể không, nhưng tôi nghĩ là có.) Tôi chỉ thử nó cho nvarchar (50).
Mzn

2
@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

1
@James Tại sao? Có gì khác biệt về kiểu dữ liệu uniqueidentifier? Các thủ tục đã lưu trữ không thể trả về mã số duy nhất?
Mzn

3
@Mzn UNIQUEIDENTIFIERchỉ là một ví dụ, RETURNđược thiết kế để chỉ hoạt động với các giá trị số nguyên, hãy xem tài liệu . Cách đề nghị nhận được dữ liệu khác từ một SP là một trong hai trả về một tập kết quả hoặc sử dụngOUTPUT
James

34
declare @EventId int

CREATE TABLE #EventId (EventId int)

insert into #EventId exec rptInputEventId

set @EventId = (select * from #EventId)

drop table #EventId 

3
thực sự là cách làm việc duy nhất được mô tả ở đây ngoài việc thay đổi chữ ký của tổ chức được lưu trữ
Michael Sander

2
Nó cũng được sử dụng cho một ngày, khi Sproc bên dưới cũng không có tham số đầu ra. (Mầm bên dưới có một Exec khác bên trong nó từ SQL động)
Jeff Beagley 27/09/2016

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

3
Chỉ có cách hoạt động ở đây mà không yêu cầu chỉnh sửa proc, điều mà tôi không thể làm trong trường hợp của mình. +1
DLeh

Bạn cũng có thể sử dụng một biến bảng thay cho bảng tạm thời.
error

6

Từ tài liệu (giả sử 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, có, nó sẽ hoạt động theo cách đó.


8
trong ví dụ của OP, họ muốn trả về một ngày tháng, các thủ tục đã lưu trữ chỉ có thể QUAY LẠI một giá trị nguyên cho một thủ tục gọi hoặc một ứng dụng.
KM.

0

Tôi đã có cùng một câu hỏi. Mặc dù có những câu trả lời tốt ở đây, tôi quyết định tạo một hàm giá trị bảng. Với hàm có giá trị bảng (hoặc vô hướng), bạn không phải thay đổi proc đã lưu trữ của mình. Tôi chỉ đơn giản thực hiện một lựa chọn từ hàm có giá trị bảng. Lưu ý rằng tham số (MyParameter là tùy chọn).

CREATE FUNCTION [dbo].[MyDateFunction] 
(@MyParameter varchar(max))
RETURNS TABLE 
AS
RETURN 
(
    --- Query your table or view or whatever and select the results.
    SELECT DateValue FROM MyTable WHERE ID = @MyParameter;
)

Để gán cho biến của bạn, bạn chỉ có thể làm như sau:

Declare @MyDate datetime;
SET @MyDate = (SELECT DateValue FROM MyDateFunction(@MyParameter));

Bạn cũng có thể sử dụng một hàm có giá trị vô hướng:

CREATE FUNCTION TestDateFunction()  
RETURNS datetime  
BEGIN  
    RETURN (SELECT GetDate());
END

Sau đó, bạn có thể đơn giản làm

Declare @MyDate datetime;
SET @MyDate = (Select dbo.TestDateFunction());
SELECT @MyDate;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.