0

より詳細なコードを記載した別の投稿がありますが、私の問題は次のロジックにあると思います。ストアド プロシージャを作成し、別のストアド プロシージャを呼び出し、呼び出されたプロシージャが最初のストアド プロシージャで使用される文字列を返すことは可能ですか?

例:

      ALTER PROCEDURE [dbo].[SP1]
-- Add the parameters for the stored procedure here
@output nvarchar(30)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

Declare @SP2Input nvarchar(30) = 'Input';
Declare @SP2Output nvarchar(30);

Execute @SP2Output = SP2 @SP2Input, @SP2Output;

If @SP2Output = 'Success'
Begin
    Set @output = 'This worked';
End
Else
Begin
    Set @output = 'This did not work';
End

Select @output;

終わり

次のストアド プロシージャは次のとおりです。

      ALTER PROCEDURE [dbo].[SP2]
-- Add the parameters for the stored procedure here
@input nvarchar(30),
@output nvarchar(30) out
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

If @input = 'Input'
Begin
    Set @output = 'Success';
End
Else
Begin
    Set @output = 'Fail';
End

Select @output;

END

では、ストアド プロシージャ SP1 を呼び出すと何が返されるのでしょうか。

Declare @output nvarchar(30);

Execute SP1 @output;

「これは機能しました」が返されると思いますか?ただし、次の 2 つの結果が返されます。1) 成功 2) これは機能しませんでした

私は何を間違っていますか?

4

1 に答える 1

3

サブプロシージャーから値を取得するには、OUTPUT パラメーターと戻り値の 2 つの方法があります。

OUTPUT パラメーターは、他の言語で参照パラメーターと呼ばれるものです。@variable を渡すと、その値を使用できますが、呼び出されたプロシージャ内で変更することもできます。これを機能させるには、プロシージャの定義で OUTPUT パラメータにしたいすべてのパラメータを次のようにマークする必要があります。

ALTER PROCEDURE [dbo].[SP2]
  @input nvarchar(30),
  @output nvarchar(30) OUT
AS
BEGIN
....

ただし、呼び出しごとに出力としてマークする必要もあります。

EXECUTE dbo.SP2 @SP2Input, @SP2Output OUT;

dbo.SP2あなたの例の呼び出しをこれに変更すると、機能するはずです。

プロシージャの実際の戻り値は常に整数です。プロシージャの return ステートメントでその値を指定します。

CREATE PROCEDURE dbo.SP3
AS
BEGIN
  RETURN 42;
END;

その後、次のように使用できます。

DECLARE @ret INT;
EXEC @ret = dbo.SP3;
PRINT @ret; -- will print 42
于 2013-06-22T17:55:11.507 に答える