我遇到了类似的问题当前的事务无法提交,也无法支持写入日志文件的操作,但我有一个后续问题.
那里的答案在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) 我有一个存储过程,在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脚本:
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)