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 中运行此脚本,我会看到选定的结果。

我尝试使用与 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 中?

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 回答