c# - 将 SQL Server 存储过程的值输出到变量中

标签 c# sql entity-framework stored-procedures

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

我有以下存储过程

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

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

  COMMIT TRANSACTION
  GO

通过 ObjectContext 的 ExecuteFunction 在 C# + EF 代码中使用它没有问题

ObjectResult<int> objectResult = ExecuteFunction<int>("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;

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

关于c# - 将 SQL Server 存储过程的值输出到变量中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8618978/

相关文章:

c# - 动态创建对象并添加到列表

MySql:如何在列中使用相同文本的 "list"记录

用于显示按日期分组的数据(按天递增)的 MySQL 查询

java - 从数据库序列中获取下一个值

c# - Linq to Entities 奇怪的部署行为

c# - DataContext db = new DataContext() - 作为全局

c# - CSharpCodeProvider 符合接口(interface)

c# - BackgroundWorker 中未处理的异常

c# - 创建没有配置文件的 WCF 客户端

sql - Entity Framework 和迁移 - 如何在远程服务器上更新我的数据库?