1. ホーム
  2. sql-server

[解決済み] ストアドプロシージャにオプションのOUTPUTパラメータを設定できますか?

2023-06-18 19:32:03

質問

複数のテーブルに値を挿入するため、多数の入力および出力パラメータを持つストアド プロシージャがあります。 場合によっては、ストアド プロシージャは 1 つのテーブルにしか挿入しません (入力パラメータに依存します)。 以下は、説明のためのモックアップシナリオです。

テーブル/データオブジェクト。

人物

Id
Name
Address

名前

Id
FirstName
LastName

住所

Id
Country
City

人を挿入するストアドプロシージャがあるとします。もし住所が存在しなければ、それを Address テーブルには追加しません。

したがって、ストアドプロシージャを呼び出すコードを生成するときに、わざわざ Address パラメータを追加する必要はありません。例えば INPUT パラメータでは、SQL Server がデフォルト値を提供することを許可しているので、これは大丈夫です。しかし OUTPUT パラメータをオプションにするためにストアドプロシージャで何をすれば、エラーが発生しないでしょうか...。

プロシージャまたは関数 'Person_InsertPerson' は、指定されていないパラメータ '@AddressId' が指定されていません。

どのように解決するのですか?

入力パラメータと出力パラメータの両方に、デフォルトを割り当てることができます。この例では

CREATE PROCEDURE MyTest
  @Data1 int
 ,@Data2 int = 0
 ,@Data3 int = null output

AS

PRINT @Data1
PRINT @Data2
PRINT isnull(@Data3, -1)

SET @Data3 = @Data3 + 1

RETURN 0

最初のパラメータは必須で、2番目と3番目はオプションです。呼び出しルーチンによって設定されない場合、それらはデフォルト値が割り当てられます。異なる値と設定を使用して、SSMS でこのルーチンと次のテスト コール ルーチンをいじってみて、すべてが一緒に動作する方法を確認してください。

DECLARE @Output int

SET @Output = 3

EXECUTE MyTest
  @Data1 = 1
 ,@Data2 = 2
 ,@Data3 = @Output output

PRINT '---------'
PRINT @Output