这似乎是一个简单的问题,但我还没有找到答案。
我有以下存储过程
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变量?
答案 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;
然后它将以您在问题中描述的方式工作。