ストアドプロシージャに次のステートメントがあります。
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にあります。
あなたのストアドプロシージャでは、あなたはどちらですか
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
別の方法
DECLARE @Count table(counting INT)
Insert into @Count
EXEC GetItemCount 123
SELECT Counting FROM @Count
実行された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
@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
別のストアドプロシージャでこれを呼び出すと、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つの方法があります。
GetItemCountで別のパラメーター@countをOUTPUTとして宣言します。したがって、GetItemCount宣言は次のようになります。
CREATE PROCEDURE GetItemCount @ID int、@ count int出力
内部では、使用できます
SELECT @count = COUNT(Item)FROM tblItem WHERE ID = @ID