web-dev-qa-db-ja.com

あるストアドプロシージャの値を別のストアドプロシージャで使用する方法

ストアドプロシージャに次のステートメントがあります。

DECLARE @Count INT
EXEC @Count = GetItemCount 123
SELECT @Count

これは、次のステートメントを使用して別のストアドプロシージャを呼び出します。

SELECT COUNT(Item) FROM tblItem WHERE ID = @ID

ただし、呼び出しをテストすると、EXECは値を正しく出力しますが、@ Count変数に正しく割り当てられません。ここを含めて、このように使用される例やストアドプロシージャを見たことがありますが、パラメータと戻り値が使用されていました(見つけることができました)。 IDパラメーターは、最初のStoredProcedureで使用されるカウント値を返す2番目のステートメントに渡されます-私が読んだすべての情報は、これが機能することを示しているようです-しかし、GetItemCountの場合でも、@ Count値がゼロから離れていません常に正しい値を返します。

これが役立つ場合、これはMicrosoft SQL Server 2008にあります。

15
RoguePlanetoid

あなたのストアドプロシージャでは、あなたはどちらですか

a)カウントの値を出力パラメーターに割り当てる:

CREATE PROCEDURE GetItemCount
  @id INT,
  @count INT OUTPUT
AS
  SELECT @count = COUNT(Item) FROM tblItem WHERE ID = @id

次のように呼ばれます:

DECLARE @count INT
EXEC GetItemCount 123, @count OUTPUT

または、b)カウント値を戻り値として割り当てる:

CREATE PROCEDURE GetItemCount
  @id INT
AS
BEGIN
  DECLARE @count INT
  SELECT @count = COUNT(Item) FROM tblItem WHERE ID = @id

  RETURN @count
END  

次のように呼ばれます:

DECLARE @count INT
EXEC @count = GetItemCount 123
28
Matthew Abbott

別の方法

DECLARE @Count table(counting INT)
Insert into @Count
EXEC GetItemCount 123 
SELECT Counting FROM @Count 
4
Madhivanan

実行されたSPの入力パラメーターがない場合、以下は機能しません。

EXEC [dbo].insertproduc 'TEST', @ProductID OUTPUT --works
EXEC [dbo].insertproduc, @ProductID OUTPUT -- generates a parameter supplied when not needed error message if the insertproduc does not require parameters.

すべての場合に次の形式を使用することをお勧めします(すべてのバージョンで機能します)。

DECLARE @MyOutputVariable int 
EXEC @MyOutputVariable  = [dbo].MyStoredProc 
2
MC9000

@Countを出力パラメーターとして渡す必要があります。

Create Proc dbo.usp_Proc1

@Id int,
@Count int output

as begin

select @Count = Count(Item) from tblItem where id=@Id

end
Go

Declare @Count int
Declare @Id int

Set @Id = 1

Exec dbo.usp_Proc1 @Id, @Count output

select @Count
2
codingbadger

別のストアドプロシージャでこれを呼び出すと、Matthew氏から提供されたソリューション(b)は機能しません(Ofcourseソリューション(a)は、OUTPUTパラメーターを使用すると完全に機能します)。解決策(b)の代替案は、マディバナン氏の解決策です。つまり、一時テーブルを作成して使用し、それをドロップします。

以下は他のソリューションです。

ストアドプロシージャの内部OUTPUT句から直接値を取得することはできません。したがって、代わりにOUTPUTパラメータまたはRETURN VALUEを使用する必要があります。

次の提案を参照してください。

解決策1:

CREATE PROCEDURE [dbo].[InsertProduct] 
      @pName varchar(50) 
AS 


BEGIN 
DECLARE @MyTableVar Table(ProductID 
int) 


      INSERT Products 
      ( 
           pName 
      ) 
      OUTPUT Inserted.ProductID 
INTO @MyTableVar 
      VALUES 
      ( 
        @pName 
      ) 
RETURN (SELECT ProductID
FROM @MyTableVar) 
END 


DECLARE @ProductID int 
EXEC @ProductID = [dbo].insertproduc 'TEST' 
SELECT @ProductID 

解決策:2

CREATE PROCEDURE [dbo].[InsertProduct]
      @pName varchar(50) , @pID int output
AS

BEGIN 
DECLARE @MyTableVar Table(ProductID int)

      INSERT Products 
      (
           pName 
      )
      OUTPUT Inserted.ProductID INTO @MyTableVar
      VALUES 
      (
        @pName
      )
SELECT @pID=ProductID FROM @MyTableVar
END

DECLARE @ProductID int
EXEC [dbo].insertproduc 'TEST', @ProductID OUTPUT
SELECT @ProductID

変数@Countでキャッチしているのは、予期した値ではなく、ストアドプロシージャGetItemCountの実行ステータスです。その価値を捉えるには、2つの方法があります。

  1. GetItemCountで別のパラメーター@countをOUTPUTとして宣言します。したがって、GetItemCount宣言は次のようになります。

    CREATE PROCEDURE GetItemCount @ID int、@ count int出力

内部では、使用できます

SELECT @count = COUNT(Item)FROM tblItem WHERE ID = @ID

  1. プロシージャを呼び出してその値を列として取得する前にテーブルを宣言します。
0