捕获不使用输出参数且不返回结果的存储过程的标量输出



我有以下(简化的)存储过程(不允许修改):

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运行它时,我在profiler中看到以下查询:

exec sp_executesql N'exec spDoSomething @p0',
N'@p0 INT',
@p0=1

NHibernate能够以某种方式检索SELECT ed@SomeID的值。

如果我在MSSQLManagementStudio中运行此脚本,我会看到所选的结果。

我尝试使用与sp_executesql相同的OUTPUT方法来处理简单的SQL查询。例如,当我运行类似的程序时

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中?

由于无法更改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

最新更新