回答

收藏

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

技术问答 技术问答 185 人阅读 | 0 人回复 | 2023-09-13

这似乎是一个简单的问题,但是我还没有找到答案。1 M# v( h- F  W5 T# x& r+ e
我有以下存储过程
: a9 i' ^+ u. b  L, n5 n3 KCREATE 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使用代码没有问题# t0 T2 N- U" i! V
ObjectResult<i> objectResult = ExecuteFunction<i>(&quot;AllocateId&quot;);然而,当我试图直接从时,SQL当脚本调用它时,它似乎不起作用) o# a, _4 O" G) W4 @* H! ?/ U
declare @Id intEXEC @Id = [dbo].[AllocateId]@Id 总是0。怎么在?sql获得脚本中的将值@Id变量中?
6 U& ]' s" h1 }2 [, @) P4 u: G' q                                                                , @" \  [' K' P
    解决方案:                                                               
- p; S) ?* W) B: ?3 B                                                                过程返回值不同于过程返回的结果集。您的存储过程返回结果集,不返回任何返回值(最终为null,在退出过程中,将被隐式转换为)。
6 j) `& X0 W) D2 H为了获得结果集,你需要调整现有的过程,你需要insert ... exec:. u5 p% V7 g0 `7 O0 j  |' p" E
declare @t table (id int);insert into @texec [dbo].[AllocateId];以返回值为返回值的,应修改存储过程:2 f9 u- U' M% S  u: C$ B( Q
CREATE PROCEDURE [dbo].[AllocateId]ASBEGIN TRANSACTIONdeclare @id int;UPDATE TOP(1) IdReservation    SET @id = Id,IsAllocated = 1    OUTPUT DELETED.Id    WHERE IsAllocated = 0COMMIT TRANSACTIONreturn @id;然后它会以你在问题中描述的方式工作。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则