0

次の (簡略化された) ストアド プロシージャがあります (変更は許可されていません)。

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 はどうにかしてSELECTed @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 に取り込むにはどうすればよいですか?

4

1 に答える 1

1

SPは変更できないので、insert...exec

declare @returnedID int

declare @t table (result int)
insert @t (result ) exec spDoSomething 
select @returnedID = result from @t

select @returnedID

または何らかの理由で sp_executesql を使用する必要がある場合

declare @returnedID int

exec sp_ExecuteSQl 
    N'declare @t table (result int);insert @t (result ) exec spDoSomething; select @returnedID = result from @t',
    N'@returnedID int output',
    @returnedID output

select @returnedID
于 2013-08-01T11:11:44.727 に答える