简体   繁体   English

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

[英]Get value output from SQL Server stored procedure into variable

This seems to be a simple question but nevertheless I haven't found an answer yet. 这似乎是一个简单的问题,但是我还没有找到答案。

I have the following stored procedure 我有以下存储过程

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

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

  COMMIT TRANSACTION
  GO

It's been used in C# + EF code without a problem via ExecuteFunction of ObjectContext 它已通过ObjectContext的ExecuteFunction用于C#+ EF代码中

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

However when I try to call it directly from SQL script it doesn't seem to work 但是,当我尝试直接从SQL脚本调用它时,它似乎不起作用

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

@Id is always 0. How do I get the value into @Id variable in sql script? @Id始终为0。如何在SQL脚本的@Id变量中获取值?

Procedure return value is different from result set(s) returned by that procedure. 过程返回值不同于该过程返回的结果集。 Your stored procedure returns a result set and does not return a return value (which ends up being null , which gets converted to 0 implicitly upon exiting the procedure). 您的存储过程返回一个结果集,并且不返回任何返回值(最终为null ,退出过程隐式转换为0 )。
To get the resultset your existing procedure retuns, you need insert ... exec : 为了获得结果集,您需要对现有过程进行调整,您需要insert ... exec

declare @t table (id int);

insert into @t
exec [dbo].[AllocateId];

If you want to return a value as a return value as well, you should amend you stored procedure: 如果还要返回一个值作为返回值,则应修改存储过程:

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;

Then it will work in the way you describe in the question. 然后它将按照您在问题中描述的方式工作。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM