2013-07-01 7 views
0

У меня есть пакет SSIS, который я запускаю вручную для тестирования. Когда я это делаю, возникает ошибка (см. Рис. Ниже). Но сначала позвольте мне объяснить, что происходит в пакете: есть только сам поток данных. Там я запрашиваю представление (OLE DB Source), которое предоставит мне параметры, которые мне понадобятся для следующего шага. Затем стрелка указывает на команду OLE DB, где I EXEC хранит процедуру на локальном сервере БД и передает параметры. Этот SP является моей оболочкой, где происходят 3 основные вещи: 1. SET XACT_ABORT ON; (нам понадобится это для распределенной транзакции позже). 2. Вызовите вспомогательный SP, который создаст новый синоним моей таблицы Remote Target. (это создает синоним, такой как MY_REMOTE_TABLE, когда он создан, я могу без проблем запросить его у себя). 3. Вызовите вспомогательный SP, который будет выполнять основную задачу. У этого вспомогательного SP есть НАЧАЛО РАСПРОСТРАНЕННОЙ ОПЕРАЦИИ. Там я вставляю в MY_REMOTE_TABLE несколько записей из моей локальной БД. Теперь я поместил запись в журнал непосредственно перед и непосредственно после BEGIN DISTRIBUTED TRANSACTION, но в моем журнале есть только запись, которую я печатаю до начала транзакции. Таким образом, похоже, что он не работает, как только он открывает распределенную транзакцию. На рисунке ниже показана ошибка, которую я получаю от SSIS, но я понятия не имею, что с этим делать. Любая идея очень ценится!Ошибка SSIS с командой OLE DB

SSIS Error MSG

Ошибка: SSIS Код ошибки DTS_E_OLEDBERROR. Произошла ошибка OLE DB. Код ошибки: 0x80040E14. Доступна запись OLE DB. Источник: «Поставщик Microsoft OLE DB для SQL Server» Hresult: 0x80040E14 Описание: «Координатор распределенных транзакций Microsoft (MS DTC) отменил распределенную транзакцию« Ошибка: код ошибки SSIS DTS_E_INDUCEDTRANSFORMFAILUREONERROR. «Вход» ввода команды OLE DB «(140)» не выполнен, потому что произошел код ошибки 0xC020906E, а расположение строки ошибки на «вводе» OLE DB Command Input «(140)» указывает на ошибку при ошибке. Произошла ошибка в указанном объекте указанного компонента. До этого могут появляться сообщения об ошибках с дополнительной информацией о сбое. Ошибка: Код ошибки SSIS DTS_E_PROCESSINPUTFAILED. Метод ProcessInput на компоненте «exec Run_My_Wrapper_SP» (135) «не удалось с кодом ошибки 0xC0209029 при обработке ввода« OLE DB Command Input »(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

не удалось скопировать его, поэтому пришлось записать его вручную:/ – BaseBallBatBoy

+0

Возможно ли, что ограничение FK на моей удаленной таблице нарушено? если да, то как мне удалось продвинуть сообщение об ошибке с удаленного сервера БД на мою локальную процедуру для его захвата? – BaseBallBatBoy

ответ

0

Убедитесь, что MSDTC включена на локальном компьютере

  • Перейти в меню «Пуск»> «Выполнить»
  • В командной строке t ype dcomcnfg и нажмите enter. Появится окно обслуживания компонентов.
  • Развернуть службы компонентов, щелкните правой кнопкой мыши на Мой компьютер и выберите начать MSDTC

Также убедитесь, выполнив Helper SP в самом окне запроса SQL Server Management Studio.

Использование Try ... Catch для обработки ошибок в блоке транзакции (НАЧАТЬ 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 
+0

, очевидно, оказалось, что ограничение FK на удаленной таблице было нарушено, в результате чего распределенная транзакция полностью откатилась. к плохому вы не можете получить более ясное сообщение об ошибке, или вы можете ??? – BaseBallBatBoy

+0

Да, мы можем. Внедряем обработку ошибок для TSQL Statement, используя TRY ... CATCH –

+0

Пример кода для обработки исключения с использованием TRY ... Конструкция CATCH добавляется в ответ. –