1

这是我的存储过程,我认为每件事都是正确的

ALTER PROC USP_D_Delete
(
   @ID INT=NULL,
   @RETURN INT OUTPUT
)
AS
BEGIN

   SET NOCOUNT ON;

   BEGIN TRY
      BEGIN TRAN

         BEGIN

            DELETE FROM PE WHERE ID =@ID

         END

      COMMIT

      SET @RETURN = 1
      RETURN @RETURN

   END TRY
   BEGIN CATCH

      ROLLBACK
      SET @RETURN = 0
      RETURN @RETURN

   END CATCH

END

当我尝试从 UI 执行此操作时,我得到 ERROR 作为

Transaction count after EXECUTE indicates a mismatching number of BEGIN and COMMIT statements.Previous count = 0, current count = 1

请提供任何帮助,我找不到解决方案,因为我认为这种语法是正确的,在 ROLLBACK 之后尝试了 COMMIT 也,它没有用..

4

2 回答 2

1

也许您必须在TRAN之后添加一个单词commitrollback如下所示:

ALTER PROC USP_D_Delete
(
   @ID INT=NULL,
   @RETURN INT OUTPUT
)
AS
BEGIN    
   SET NOCOUNT ON;    
   BEGIN TRY
      BEGIN TRAN    
         BEGIN    
            DELETE FROM PE WHERE ID =@ID    
         END    
      COMMIT TRAN    
      SET @RETURN = 1
      RETURN @RETURN    
   END TRY
   BEGIN CATCH    
      ROLLBACK TRAN
      SET @RETURN = 0
      RETURN @RETURN    
   END CATCH    
END
于 2013-07-19T07:27:13.307 回答
0

也许我遗漏了一些东西,但恕我直言,您的 SP 代码没有任何意义,因为它是:

  1. DELETE语句是原子的,不需要显式事务
  2. 您的 SP 将始终返回 1,因为如果您向其提供不存在的 id,DELETE它将静默执行并且不会删除任何内容。唯一可能出错并导致异常的是没有PE表。但在那种情况下,你没有任何东西可以回滚。

话虽如此,整个 SP 可以归结为唯一的DELETE声明

于 2013-07-19T07:44:11.413 回答