这似乎是一个简单的问题,但我还没有找到答案。
我有以下存储过程
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/