次の (簡略化された) ストアド プロシージャがあります (変更は許可されていません)。
CREATE PROCEDURE [dbo].[spDoSomething]
@someArg INT
AS
BEGIN
SET NOCOUNT ON;
DECLARE @SomeID INT
-- some code which sets @SomeID --
SET @SomeID = 10
SELECT @SomeID AS SomeID
END
NHibernate から実行すると、プロファイラーに次のクエリが表示されます。
exec sp_executesql N'exec spDoSomething @p0',
N'@p0 INT',
@p0=1
NHibernate はどうにかしてSELECT
ed @SomeID の値を取得できます。
このスクリプトを MSSQL ManagementStudio で実行すると、選択した結果が表示されます。
単純な SQL クエリで sp_executesql に使用するのと同じ OUTPUT アプローチを使用しようとしました。たとえば、次のようなものを実行すると
exec sp_executesql N'INSERT INTO Users ... VALUES (...); select @UserId = SCOPE_IDENTITY()',
N'@UserId INT OUTPUT, ...',
@UserId OUTPUT, ...
SCOPE_IDENTITY() の結果は @UserId に格納されます。しかし、何らかの理由で、同じアプローチが [spDoSomething] では機能しません。次のことを試してみると:
DECLARE @ReturnedID INT
exec sp_executesql N'exec spDoSomething @p0',
N'@ReturnedID INT OUTPUT, @p0 INT',
@ReturnedID OUTPUT, @p0=1
SELECT @ReturnedID
私の @ReturnedID は NULL です。
@SomeID の値を @ReturnedID に取り込むにはどうすればよいですか?