วิธีกำหนดผลลัพธ์ exec ให้กับตัวแปร sql?


111

คุณกำหนดผลลัพธ์ของการเรียก exec ให้กับตัวแปรใน SQL ได้อย่างไร? ฉันมี proc ที่เก็บไว้up_GetBusinessDayซึ่งเรียกว่าซึ่งส่งคืนวันที่เดียว

คุณสามารถทำสิ่งนี้ได้หรือไม่:

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

คำตอบ:


100

ฉันใช้ค่าส่งคืนเพื่อส่งต่อสถานะข้อผิดพลาดย้อนกลับเสมอ หากคุณต้องการส่งกลับค่าหนึ่งค่าฉันจะใช้พารามิเตอร์เอาต์พุต

ขั้นตอนการจัดเก็บตัวอย่างพร้อมพารามิเตอร์ 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

เรียกไปยังโพรซีเดอร์ที่จัดเก็บโดยมีพารามิเตอร์ OUTPUT:

DECLARE @OutputParameter  datetime
       ,@ReturnValue      int

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

เอาท์พุท:

0
2010-01-01 00:00:00.000

10
ด้วยการใช้พารามิเตอร์ OUTPUT คุณสามารถส่งคืนข้อมูลประเภทใดก็ได้ค่า RETURN จากโพรซีเดอร์ที่เก็บไว้สามารถเป็นจำนวนเต็มเท่านั้น
กม ธ .

2
หมายเหตุด้านข้างพารามิเตอร์ OUTPUT ที่ประกาศด้วยค่าไม่จำเป็นต้องส่งผ่านซึ่งหมายความว่าหากคุณกำลังแก้ไข SP ที่มีอยู่คุณสามารถทำได้อย่างปลอดภัยโดยไม่ต้องเสี่ยงกับการทำลายอะไรเลย เช่น @ Param3 datetime = '1900-01-01' OUTPUT
Morvael

55

สิ่งนี้จะได้ผลหากคุณต้องการคืนค่าจำนวนเต็ม:

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

13
-1 สิ่งนี้จะส่งคืนเฉพาะจำนวนเต็ม OP ต้องการคืนวันที่ คำตอบที่ยอมรับโดย @KM เป็นคำตอบที่ถูกต้องเนื่องจากใช้ OUTPUT แทน RETURN
Code Maverick

4
ใช้งานได้จริง ตัวอย่างวิธีรับจำนวนเต็มที่ส่งคืนคุณสามารถทำเช่นเดียวกันสำหรับชนิดอื่น ๆ ทั้งหมด (ไม่ได้ตรวจสอบว่าเป็นไปได้ตารางหรือไม่ แต่ฉันคิดว่าใช่) ฉันเพิ่งลองใช้ nvarchar (50)
Mzn

2
@Mzn "คุณสามารถทำเช่นเดียวกันสำหรับชนิดอื่น ๆ ทั้งหมด"UNIQUEIDENTIFIERอย่างแน่นอนไม่ได้ทำงานกับ
James

1
@ เจมส์ทำไม? ชนิดข้อมูลตัวบ่งชี้ที่แตกต่างกันอย่างไร กระบวนงานที่จัดเก็บไว้ไม่สามารถส่งคืนตัวบ่งชี้เฉพาะ?
Mzn

3
@Mzn UNIQUEIDENTIFIERเป็นเพียงตัวอย่างที่RETURNถูกออกแบบมาเพื่อการทำงานเฉพาะกับค่าจำนวนเต็มให้ดูเอกสาร วิธีที่แนะนำในการรับข้อมูลอื่น ๆ จาก SP คือส่งคืนชุดผลลัพธ์หรือใช้OUTPUT
James

35
declare @EventId int

CREATE TABLE #EventId (EventId int)

insert into #EventId exec rptInputEventId

set @EventId = (select * from #EventId)

drop table #EventId 

3
วิธีการทำงานเดียวที่อธิบายไว้ที่นี่นอกเหนือจากการเปลี่ยนลายเซ็นของ proc ที่เก็บไว้
Michael Sander

2
ใช้สิ่งนี้เช่นกันสำหรับวันที่เมื่อ Sproc ที่อยู่ข้างใต้ไม่มีพารามิเตอร์เอาต์พุตเช่นกัน (พื้นฐาน sproc มี Exec อื่นอยู่ภายในจากไดนามิก SQL)
Jeff Beagley

3
@MichaelSander ถูกต้องวิธีแก้ปัญหาอื่น ๆ ทั้งหมดไม่สามารถตอบคำถาม OPs ได้อย่างถูกต้อง วิธีเดียวคือตารางชั่วคราวซึ่งเก็บผลลัพธ์ไว้
SQL Police

3
วิธีเดียวที่ใช้งานได้ที่นี่โดยไม่ต้องแก้ไข proc ซึ่งฉันไม่สามารถทำได้ในกรณีของฉัน +1
DLeh

คุณยังสามารถใช้ตัวแปรตารางแทนตารางชั่วคราวได้
ข้อผิดพลาด

6

จากเอกสารประกอบ (สมมติว่าคุณใช้ SQL-Server):

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

ใช่มันควรจะได้ผล


8
ในตัวอย่างของ OP พวกเขาต้องการส่งคืนวันที่กระบวนงานที่จัดเก็บไว้สามารถส่งคืนค่าจำนวนเต็มไปยังขั้นตอนการโทรหรือแอปพลิเคชันเท่านั้น
กม ธ .

0

ฉันมีคำถามเดียวกัน แม้ว่าจะมีคำตอบที่ดีอยู่ที่นี่ฉันจึงตัดสินใจสร้างฟังก์ชันที่มีมูลค่าตาราง ด้วยฟังก์ชันที่มีค่าของตาราง (หรือสเกลาร์) คุณไม่จำเป็นต้องเปลี่ยน proc ที่จัดเก็บไว้ ฉันเพียงแค่เลือกจากฟังก์ชันมูลค่าตาราง โปรดทราบว่าพารามิเตอร์ (MyParameter เป็นทางเลือก)

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;
)

ในการกำหนดให้กับตัวแปรของคุณคุณสามารถทำได้ดังนี้:

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

คุณยังสามารถใช้ฟังก์ชันค่าสเกลาร์:

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

จากนั้นคุณสามารถทำได้

Declare @MyDate datetime;
SET @MyDate = (Select dbo.TestDateFunction());
SELECT @MyDate;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.