実行結果をSQL変数に割り当てる方法は?


108

exec呼び出しの結果をSQLの変数にどのように割り当てますか?と呼ばれるストアドプロシージャがありますup_GetBusinessDayつの日付を返すがあります。

あなたはこのようなことをすることができます:

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

回答:


97

私は常にエラー値を返すために戻り値を使用しています。1つの値を返す必要がある場合は、出力パラメーターを使用します。

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 2016年

55

これは単に整数を返したい場合に機能します:

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

13
-1これは整数のみを返します。OPは日付を返したいと考えています。@KMが承認した回答。RETURNの代わりにOUTPUTを使用するため、これが正解です。
Code Maverick

4
実際にこれは動作します。返される整数を取得する方法に関する例では、他のすべての種類でも同じことができます(テーブルが可能かどうかは確認していませんが、そうだと思います)。nvarchar(50)で試してみました。
Mzn 2014年

2
@Mzn "他のすべての種類でも同じことができます"は、確かに動作しませんUNIQUEIDENTIFIER
James

1
@ジェームズなぜ?uniqueidentifierデータ型の違いは何ですか?ストアドプロシージャはuniqueidentifiersを返すことができませんか?
Mzn

3
@Mzn UNIQUEIDENTIFIERは単なる例でRETURNあり、整数値でのみ機能するように設計されています。ドキュメントを参照してください。SPから他のデータを取得するための推奨される方法は、結果セットを返すか使用することですOUTPUT
James

34
declare @EventId int

CREATE TABLE #EventId (EventId int)

insert into #EventId exec rptInputEventId

set @EventId = (select * from #EventId)

drop table #EventId 

3
ストアドプロシージャの署名の変更を除いて、実際にここで説明した唯一の有効な方法
Michael Sander

2
基になるSprocにも出力パラメーターがない場合、これを日付にも使用しました。(基になる
sproc

3
@MichaelSanderまったく正しい、他のすべてのソリューションは、OPの質問に正しく答えていません。唯一の方法は、結果を保持する一時テーブルです。
SQLポリス

3
ここで機能する唯一の方法は、プロシージャの編集を必要とせず、私の場合はできません。+1
DLeh 2017

一時テーブルの代わりにテーブル変数を使用することもできます。
エラー

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

同じ質問がありました。ここには良い答えがありますが、テーブル値関数を作成することにしました。テーブル(またはスカラー)値関数を使用すると、ストアドプロシージャを変更する必要はありません。私は単にテーブル値関数から選択を行いました。パラメータに注意してください(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.