Bagaimana cara menetapkan hasil exec ke variabel sql?

108

Bagaimana Anda menetapkan hasil panggilan exec ke variabel di SQL? Saya memiliki proc tersimpan yang disebut up_GetBusinessDay, yang mengembalikan satu tanggal.

Bisakah Anda melakukan sesuatu seperti ini:

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

Jawaban:

97

Saya selalu menggunakan nilai kembali untuk meneruskan status kesalahan. Jika Anda perlu mengembalikan satu nilai, saya akan menggunakan parameter output.

sampel prosedur tersimpan, dengan parameter 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

panggilan ke prosedur tersimpan, dengan parameter OUTPUT:

DECLARE @OutputParameter  datetime
       ,@ReturnValue      int

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

KELUARAN:

0
2010-01-01 00:00:00.000
KM.
sumber
10
Dengan menggunakan parameter OUTPUT, Anda dapat mengembalikan tipe data apa pun, nilai RETURN dari prosedur tersimpan hanya dapat berupa bilangan bulat.
KM.
2
Sekadar catatan, parameter OUTPUT yang dideklarasikan dengan nilai tidak perlu diteruskan. Ini berarti jika Anda mengubah SP yang ada, Anda dapat melakukannya dengan aman tanpa berisiko merusak apa pun. misalnya, @ Param3 datetime = '1900-01-01' OUTPUT.
Morvael
55

Ini akan berfungsi jika Anda ingin mengembalikan integer:

DECLARE @ResultForPos INT 
EXEC @ResultForPos = storedprocedureName 'InputParameter'
SELECT @ResultForPos
Siddhesh Bondre
sumber
13
-1 Ini hanya akan mengembalikan integer. OP ingin mengembalikan tanggal. Jawaban yang diterima oleh @KM. adalah jawaban yang benar, karena menggunakan OUTPUT daripada RETURN.
Kode Maverick
4
Sebenarnya ini berhasil. Contoh bagaimana mendapatkan integer yang dikembalikan, Anda dapat melakukan hal yang sama untuk semua jenis lainnya (tidak memeriksa apakah tabel memungkinkan, tapi saya rasa ya.) Saya baru saja mencobanya untuk nvarchar (50).
Mzn
2
@Mzn "Anda dapat melakukan hal yang sama untuk semua jenis lainnya" , tentu saja tidak berhasil UNIQUEIDENTIFIER.
James
1
@ James Mengapa? Apa yang berbeda dengan tipe data uniqueidentifier? Prosedur yang disimpan tidak dapat mengembalikan pengidentifikasi unik?
Mzn
3
@Mzn UNIQUEIDENTIFIERhanyalah sebuah contoh, RETURNdirancang untuk hanya bekerja dengan nilai integer, lihat dokumen . Cara yang disarankan untuk mendapatkan data lain dari SP adalah dengan mengembalikan set hasil atau menggunakanOUTPUT
James
34
declare @EventId int

CREATE TABLE #EventId (EventId int)

insert into #EventId exec rptInputEventId

set @EventId = (select * from #EventId)

drop table #EventId 
AZ Chad
sumber
3
sebenarnya satu-satunya cara kerja yang dijelaskan di sini selain mengubah tanda tangan proc yang disimpan
Michael Sander
2
Digunakan ini juga untuk tanggal, ketika Sproc yang mendasari tidak memiliki parameter keluaran juga. (Sproc yang mendasari memiliki Exec lain di dalamnya dari SQL dinamis)
Jeff Beagley
3
@MichaelSander Benar sekali, semua solusi lain tidak menjawab pertanyaan OPs dengan benar. Satu-satunya cara adalah tabel sementara yang menyimpan hasil.
Polisi SQL
3
Satu-satunya cara yang berfungsi di sini tanpa memerlukan pengeditan pada proc, yang tidak dapat saya lakukan dalam kasus saya. +1
DLeh
Anda juga dapat menggunakan variabel tabel sebagai pengganti tabel temp.
kesalahan
6

Dari dokumentasi (dengan asumsi Anda menggunakan SQL-Server):

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

Jadi ya, seharusnya seperti itu.

Peter Lang
sumber
8
dalam contoh OP mereka ingin mengembalikan tanggal, prosedur Tersimpan hanya dapat MENGEMBALIKAN nilai integer ke prosedur panggilan atau aplikasi.
KM.
0

Saya memiliki pertanyaan yang sama. Meskipun ada jawaban bagus di sini, saya memutuskan untuk membuat fungsi nilai tabel. Dengan fungsi bernilai tabel (atau skalar), Anda tidak perlu mengubah proc yang disimpan. Saya hanya melakukan seleksi dari fungsi nilai tabel. Perhatikan bahwa parameter (MyParameter bersifat opsional).

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

Untuk menetapkan ke variabel Anda, Anda cukup melakukan sesuatu seperti:

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

Anda juga dapat menggunakan fungsi bernilai skalar:

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

Maka Anda bisa melakukannya

Declare @MyDate datetime;
SET @MyDate = (Select dbo.TestDateFunction());
SELECT @MyDate;
CodeCaptain
sumber