2013-08-01 59 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