相关疑难解决方法(0)

SQL事务错误:无法提交当前事务,并且无法支持写入日志文件的操作

我遇到了类似的问题当前的事务无法提交,也无法支持写入日志文件的操作,但我有一个后续问题.

那里的答案在Transact-SQL中引用了使用TRY ... CATCH,我将在一秒钟内回过头来......

我的代码(当然继承)有简化形式:

SET NOCOUNT ON
SET XACT_ABORT ON

CREATE TABLE #tmp

SET @transaction = 'insert_backtest_results'
BEGIN TRANSACTION @transaction

BEGIN TRY

    --do some bulk insert stuff into #tmp

END TRY

BEGIN CATCH
    ROLLBACK TRANSACTION @transaction
    SET @errorMessage = 'bulk insert error importing results for backtest '
        + CAST(@backtest_id as VARCHAR) +
        '; check backtestfiles$ directory for error files ' + 
        ' error_number: ' + CAST(ERROR_NUMBER() AS VARCHAR) + 
        ' error_message: ' + …
Run Code Online (Sandbox Code Playgroud)

sql-server transactions sql-server-2005

36
推荐指数
2
解决办法
12万
查看次数

忽略触发器中的错误

我有一个存储过程,在Insert/Update/Delete的触发器内调用.

问题是该SP内部存在某个代码块并不重要.因此,我想忽略此代码块产生的任何错误.

我在TRY CATCH块中插入了这个代码块.但令我惊讶的是我收到了以下错误:

当前事务无法提交,也无法支持写入日志文件的操作.回滚交易.

然后我尝试使用SAVE&ROLLBACK TRANSACTION和TRY CATCH,它也因以下错误而失败:

当前事务无法提交,也无法回滚到保存点.回滚整个交易.

我的服务器版本是:Microsoft SQL Server 2008(SP2) - 10.0.4279.0(X64)

样本DDL:

IF OBJECT_ID('TestTrigger') IS NOT NULL
    DROP TRIGGER TestTrigger
GO
IF OBJECT_ID('TestProcedure') IS NOT NULL
    DROP PROCEDURE TestProcedure
GO
IF OBJECT_ID('TestTable') IS NOT NULL
    DROP TABLE TestTable
GO

CREATE TABLE TestTable (Data VARCHAR(20))
GO

CREATE PROC TestProcedure       
AS      
BEGIN 

    SAVE TRANSACTION Fallback
    BEGIN TRY
        DECLARE @a INT = 1/0
    END TRY
    BEGIN CATCH
        ROLLBACK TRANSACTION Fallback
    END CATCH
END
GO

CREATE TRIGGER TestTrigger
ON TestTable …
Run Code Online (Sandbox Code Playgroud)

sql-server triggers transactions try-catch

6
推荐指数
2
解决办法
1万
查看次数

EXECUTE后的事务计数表示BEGIN和COMMIT的数量不匹配?

问题:我有这个SQL脚本:

DECLARE @in_TE_UID varchar(36) 
DECLARE @in_ZO_BETE_Sort int 
DECLARE @in_user int 


SET @in_TE_UID = '9f510440-8828-44ce-bbea-6bc866902262'
SET @in_ZO_BETE_Sort = 0 
SET @in_user = 12435

-- http://stackoverflow.com/questions/884334/tsql-try-catch-transaction-in-trigger
BEGIN TRANSACTION BeforeUpdate;
BEGIN TRY
    IF NOT EXISTS 
    (
        SELECT 1 FROM T_FMS_ZO_Benutzer_TeaserOrder 
        WHERE (T_FMS_ZO_Benutzer_TeaserOrder.ZO_BETE_Status = 1) 
        AND (T_FMS_ZO_Benutzer_TeaserOrder.ZO_BETE_BE_ID = @in_user) 
        AND 
        (
            T_FMS_ZO_Benutzer_TeaserOrder.ZO_BETE_TE_UID = @in_TE_UID 
            OR 
            (
                @in_TE_UID IS NULL 
                AND 
                T_FMS_ZO_Benutzer_TeaserOrder.ZO_BETE_TE_UID IS NULL 
            ) 
        )    
    )
    BEGIN
        INSERT INTO T_FMS_ZO_Benutzer_TeaserOrder 
        (
             ZO_BETE_UID
            ,ZO_BETE_BE_ID
            ,ZO_BETE_TE_UID
            ,ZO_BETE_Sort
            ,ZO_BETE_Status
        )
        VALUES
        (
             NEWID() --<ZO_BETE_UID, uniqueidentifier,>
            ,@in_user --<ZO_BETE_BE_ID, …
Run Code Online (Sandbox Code Playgroud)

sql t-sql sql-server transactions sql-server-2008

1
推荐指数
1
解决办法
1万
查看次数