Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL错误--EXECUTE表示BEGIN和COMMIT语句的数量不匹配_Sql_Sql Server 2008 - Fatal编程技术网

SQL错误--EXECUTE表示BEGIN和COMMIT语句的数量不匹配

SQL错误--EXECUTE表示BEGIN和COMMIT语句的数量不匹配,sql,sql-server-2008,Sql,Sql Server 2008,这是我的存储过程,我认为每件事都是正确的 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 @RETU

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

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执行此操作时,我得到的错误如下

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

请提供任何帮助,我无法找到解决方案,因为我认为此语法正确,尝试在回滚后提交,也没有用。

可能您必须在
提交和
回滚后添加一个单词
TRAN
,如下所示:

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

可能您必须在
commit
rollback
之后添加一个单词
TRAN
,如下所示:

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

也许我遗漏了一些东西,但我认为您的SP代码没有意义:

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

  • 也就是说,整个SP可以归结为唯一的
    DELETE
    语句

    也许我遗漏了一些东西,但我认为您的SP代码没有意义:

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

  • 也就是说,整个SP可以归结为唯一的
    DELETE
    statement

    请回答一个问题好吗?它做什么,你想让它做什么?也许如果你给交易起个名字
    BEGIN TRAN t1
    COMMIT TRAN t1
    ROLLBACK TRAN t1
    @您想为该事务命名并重试吗?请参见下面的答案,代码看起来不错。我这里没有SQL Server,无法尝试;)拜托,你能用短语问个问题吗?它做什么,你想让它做什么?也许如果你给交易起个名字
    BEGIN TRAN t1
    COMMIT TRAN t1
    ROLLBACK TRAN t1
    @您想为该事务命名并重试吗?请参见下面的答案,代码看起来不错。我这里没有SQL Server,无法尝试;)