Sql server 2012 SQL Server抛出和事务

Sql server 2012 SQL Server抛出和事务,sql-server-2012,Sql Server 2012,我完全明白为了提供信息而向调用程序抛出一个错误是一件奇怪的事情,但是使用这里给出的代码,我有下面的代码,我从C#调用它 将引发错误,但不会删除数据。如果我不抛出,那么数据将被删除。既然我在一个事务中有删除,为什么抛出后会导致删除回滚,这似乎是它正在做的 IF (@action = 'D') BEGIN BEGIN TRANSACTION DELETE FROM dbo.inv_detail WHERE inv_id = @i

我完全明白为了提供信息而向调用程序抛出一个错误是一件奇怪的事情,但是使用这里给出的代码,我有下面的代码,我从C#调用它

将引发错误,但不会删除数据。如果我不抛出,那么数据将被删除。既然我在一个事务中有删除,为什么抛出后会导致删除回滚,这似乎是它正在做的

IF (@action = 'D')
        BEGIN
            BEGIN TRANSACTION
                DELETE FROM dbo.inv_detail WHERE inv_id = @inv_id;
                DELETE FROM dbo.inv_header WHERE inv_id = @inv_id;
            COMMIT TRAN

            --Returns an info message to indicate that the repository invoice has been deleted
            SET @InfoMessage = 'Number: ' + LTRIM(STR(@inv_ref_nbr)) + ' for Site: ' + LTRIM(STR(@site)) + ' has been deleted';
            THROW 50001, @InfoMessage, 1;
        END
这被包装在一个try/catch中,其中catch是:

BEGIN CATCH

        SELECT  @ErrorNumber = ERROR_NUMBER(),
                @ErrorMessage = ERROR_MESSAGE(),
                @ErrorSeverity = ERROR_SEVERITY(),
                @ErrorState = ERROR_STATE();

        -- Use RAISERROR inside the CATCH block to return error
        -- information about the original error that caused
        -- execution to jump to the CATCH block.
        RAISERROR (@ErrorMessage,  -- Message text.
                   @ErrorSeverity, -- Severity.
                   @ErrorState     -- State.
                   );
    END CATCH

从注释推断,问题是因为调用C#代码在事务中执行T-SQL。当出现错误时,C#代码会自动检测并回滚整个事务

您提到,此代码的原始版本使用
RAISERROR
来引发低严重性错误。
严重性为
的错误,如果我不抛出,则数据将被删除。
这不意味着没有错误吗?是的,他们正在使用此功能将删除的详细信息返回给调用程序。他们没有用它来犯真正的错误。我得到了正确的选择,很可能是一个out参数,但只是好奇throw似乎在回滚上面的删除事务,即使它已经提交。你总是抛出错误
throw 50001,@InfoMessage,1对,这一切都包装在一个try-catch中,因此如果删除过程中发生了真正的错误,它将命中外部捕获,但如果没有发生错误,我会抛出此信息消息,说一切顺利。听起来你可能触发了某个外层的错误处理,从而导致回滚。您是否考虑过使用
RAISERROR
生成具有“信息”严重性的错误(