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

 ObjectResult objectResult = ExecuteFunction("AllocateId"); 

但是,当我尝试直接从SQL脚本调用它时,它似乎不起作用

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

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

过程返回值与该过程返回的结果集不同。 您的存储过程返回结果集,并且不返回返回值(最终为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; 

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