2011-12-23 69 views
1

这似乎是一个简单的问题,但我还没有找到答案。从SQL Server存储过程获取值输出到变量

我有以下存储过程

CREATE PROCEDURE [dbo].[AllocateId] 
AS 
    BEGIN TRANSACTION 

    UPDATE TOP(1) IdReservation 
    SET IsAllocated = 1 
    OUTPUT DELETED.Id 
    WHERE IsAllocated = 0 

    COMMIT TRANSACTION 
    GO 

它在C#+ EF代码通过ObjectContext的

ObjectResult<int> objectResult = ExecuteFunction<int>("AllocateId"); 

然而ExecuteFunction被使用没有问题,当我尝试直接从SQL脚本中调用它它似乎没有工作

declare @Id int 
EXEC @Id = [dbo].[AllocateId] 

@Id始终为0.如何在sql脚本中将值变为@Id变量?

回答

6

过程返回值与该过程返回的结果集不同。您的存储过程返回一个结果集并且不返回返回值(最终结果为null,在退出过程时隐式转换为0)。
要得到结果集中现有的程序retuns,你需要insert ... exec

declare @t table (id int); 

insert into @t 
exec [dbo].[AllocateId]; 

如果你想返回一个值作为返回值,以及,你应该修改你的存储过程:

CREATE PROCEDURE [dbo].[AllocateId] 
AS 
BEGIN TRANSACTION 

declare @id int; 

UPDATE TOP(1) IdReservation 
    SET @id = Id, IsAllocated = 1 
    OUTPUT DELETED.Id 
    WHERE IsAllocated = 0 

COMMIT TRANSACTION 

return @id; 

然后它会以你在问题中描述的方式工作。

+0

我注意到我评论后。这并不清楚,除了你的评论,这使得它更清晰:) – MatBailie 2011-12-23 17:55:35

相关问题