我有一个SSIS包,我手动执行测试。当我这样做时,会发生错误(见下图)。但首先让我解释一下包中会发生什么:只有数据流本身。在那里我查询一个视图(OLE DB源),它将为我提供下一步所需的参数。然后箭头指向OLE DB命令,我在本地数据库服务器上执行存储过程并移交参数。 这个SP是我的包装器,其中有三个主要的事情发生:1。SET XACT_ABORT ON; (稍后我们将需要这个用于分布式事务)2。调用辅助SP,它将为我的远程目标表创建一个新的同义词。 (这会创建一个像MY_REMOTE_TABLE这样的同义词,当它被创建时,我可以毫无问题地查询它)3。调用将执行主任务的辅助SP。 该助手SP具有BEGIN DISTRIBUTED TRANSACTION。在那里,我从我的本地数据库插入MY_REMOTE_TABLE一些记录。现在我在BEGIN DISTRIBUTED TRANSACTION之前和之后直接放置了一个日志条目,但是在我的日志中,只有在事务开始之前打印的条目。因此,只要打开分布式事务,它就会失败。 下面的图片显示了我从SSIS获得的错误,但我不知道该怎么做。任何想法都非常感谢!
错误:SSIS错误代码DTS_E_OLEDBERROR。发生OLE DB错误。错误代码:0x80040E14。 OLE DB记录可用。来源:“用于SQL Server的Microsoft OLE DB提供程序”Hresult:0x80040E14说明:“Microsoft分布式事务处理协调器(MS DTC)已取消分布式事务” 错误:SSIS错误代码DTS_E_INDUCEDTRANSFORMFAILUREONERROR。 “输入”OLE DB命令输入“(140)”失败,因为发生错误代码0xC020906E,并且“输入”OLE DB命令输入“(140)”上的错误行处置指定错误失败。指定组件的指定对象发生错误。在此之前可能会发布错误消息,其中包含有关失败的更多信息。 错误:SSIS错误代码DTS_E_PROCESSINPUTFAILED。组件“exec Run_My_Wrapper_SP”(135)上的ProcessInput方法在处理输入“OLE DB命令输入”时失败,错误代码为0xC0209029(140)。标识的组件从ProcessInput方法返回错误。该错误特定于组件,但错误是致命的,并且会导致数据流任务停止运行。在此之前可能会发布错误消息,并提供有关失败的更多信息。
BEGIN TRY
BEGIN DISTRIBUTED TRANSACTION
-- do my stuff here
IF (@@TRANCOUNT > 0 AND XACT_STATE() = 1)
BEGIN
COMMIT TRANSACTION
END
IF @Output_on = 1
EXEC sp_write_to_log 'End of DISTRIBUTED TRANSACTION!';
END TRY
BEGIN CATCH
IF (@@TRANCOUNT > 0 AND XACT_STATE() = -1)
ROLLBACK TRANSACTION
INSERT INTO my_error_log (Time, Source, MSG, MSG_NR, Line_Nr)
VALUES (GETDATE(), ERROR_PROCEDURE() , ERROR_MESSAGE(), ERROR_NUMBER(), ERROR_LINE());
IF @Output_on = 1
EXEC sp_write_to_log 'Error in DISTRIBUTED TRANSACTION!';
END CATCH;
答案 0 :(得分:0)
确保在本地计算机上启用了MSDTC
还要通过在SQL Server Management Studio查询窗口中执行Helper SP来验证。
使用TRY ... CATCH处理事务块中的错误(BEGIN TRAN ... COMMIT)
SET XACT_ABORT ON;
BEGIN TRY
BEGIN TRANSACTION;
/*******...YOUR QUERY HERE eg. DELETE FROM customer..*******/
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
-- retrieve error information
SELECT
ERROR_NUMBER() AS ErrorNumber
,ERROR_SEVERITY() AS ErrorSeverity
,ERROR_STATE() AS ErrorState
,ERROR_LINE () AS ErrorLine
,ERROR_PROCEDURE() AS ErrorProcedure
,ERROR_MESSAGE() AS ErrorMessage;
IF (XACT_STATE()) = -1 --uncommittable transaction state.
BEGIN
SELECT
N'The transaction is in an uncommittable state.' +
'Rolling back transaction.'
ROLLBACK TRANSACTION;
END;
IF (XACT_STATE()) = 1 --committabletransaction state
BEGIN
SELECT
N'The transaction is committable.' +
'Committing transaction.'
COMMIT TRANSACTION;
END;
END CATCH;
GO