2013-08-01 57 views
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的莫名其妙能够检索SELECT版@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中?

回答

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