从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;
然后它将按照您在问题中描述的方式工作。