一尘不染

将SQL Server存储过程的值输出获取到变量中

sql

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

我有以下存储过程

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代码中使用,没有问题

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

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

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

@Id 始终为0。如何在sql脚本中将值获取到@Id变量中?


阅读 180

收藏
2021-05-05

共1个答案

一尘不染

过程返回值不同于该过程返回的结果集。您的存储过程返回一个结果集,并且不返回任何返回值(最终为null0在退出过程时将被隐式转换为)。
为了获得结果集,您需要对现有过程进行调整,您需要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;

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

2021-05-05