从SQL Server存储过程获取值输出到变量

Pau*_*aul 1 c# sql stored-procedures entity-framework

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

我有以下存储过程

CREATE PROCEDURE [dbo].[AllocateId]
AS
  BEGIN TRANSACTION

  UPDATE TOP(1) IdReservation 
  SET IsAllocated = 1
  OUTPUT DELETED.Id
  WHERE IsAllocated = 0 

  COMMIT TRANSACTION
  GO
Run Code Online (Sandbox Code Playgroud)

它已经在C#+ EF代码中使用而没有ExecuteFunctionObjectContext 的问题

ObjectResult<int> objectResult = ExecuteFunction<int>("AllocateId");
Run Code Online (Sandbox Code Playgroud)

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

declare @Id int
EXEC @Id = [dbo].[AllocateId]
Run Code Online (Sandbox Code Playgroud)

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

GSe*_*erg 6

过程返回值与该过程返回的结果集不同.您的存储过程返回一个结果集,并且不返回返回值(最终会返回null,0在退出过程时会隐式转换).
要获取结果集,您的现有过程将返回,您需要insert ... exec:

declare @t table (id int);

insert into @t
exec [dbo].[AllocateId];
Run Code Online (Sandbox Code Playgroud)

如果要将值作为返回值返回,则应修改存储过程:

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;
Run Code Online (Sandbox Code Playgroud)

然后它将以您在问题中描述的方式工作.