从SQL Server存储过程获取值输出到变量

时间:2011-12-23 17:33:47

标签: c# sql entity-framework stored-procedures

这似乎是一个简单的问题,但我还没有找到答案。

我有以下存储过程

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的ExecuteFunction

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

但是,当我尝试直接从SQL脚本调用它时,它似乎无法正常工作

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

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

1 个答案:

答案 0 :(得分:6)

过程返回值与该过程返回的结果集不同。您的存储过程返回一个结果集,并且不返回返回值(最终为null,在退出过程时会隐式转换为0。)
要获取结果集,您的现有过程将返回,您需要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;

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