这似乎是一个简单的问题,但是我还没有找到答案。
我有以下存储过程
CREATE PROCEDURE [dbo].[AllocateId] AS BEGIN TRANSACTION UPDATE TOP(1) IdReservation SET IsAllocated = 1 OUTPUT DELETED.Id WHERE IsAllocated = 0 COMMIT TRANSACTION GO
它已通过ExecuteFunctionObjectContext在C#+ EF代码中使用,没有问题
ExecuteFunction
ObjectResult<int> objectResult = ExecuteFunction<int>("AllocateId");
但是,当我尝试直接从SQL脚本调用它时,它似乎不起作用
declare @Id int EXEC @Id = [dbo].[AllocateId]
@Id 始终为0。如何在sql脚本中将值获取到@Id变量中?
@Id
过程返回值不同于该过程返回的结果集。您的存储过程返回一个结果集,并且不返回任何返回值(最终为null,0在退出过程时将被隐式转换为)。 为了获得结果集,您需要对现有过程进行调整,您需要insert ... exec:
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;
然后它将按照您在问题中描述的方式工作。