OLE DB命令的SSIS错误

时间:2013-07-01 09:54:02

标签: sql sql-server stored-procedures ssis

我有一个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 Error MSG

错误: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;

1 个答案:

答案 0 :(得分:0)

确保在本地计算机上启用了MSDTC

  • 转到“开始”菜单>运行
  • 在命令提示符下键入dcomcnfg并按Enter键。将弹出组件服务窗口。
  • 展开组件服务,右键单击“我的电脑”,然后选择“开始” 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