Пакеты служб SSIS завершаются ошибкой, когда таблица не существует, даже если к ней никогда не будет доступа - PullRequest
1 голос
/ 18 ноября 2011

В SSIS 2008 у меня есть Задача сценария , которая проверяет, существует ли таблица в базе данных, и устанавливает логическую переменную.

В моем потоке данных я делаю Условное разбиение на основе этой переменной, чтобы я мог выполнять соответствующие команды OLE DB в зависимости от того, существует эта таблица или нет.

Если таблица существует, пакет будет работать правильно.Но если таблица не существует, SSIS проверяет метаданные команды OLE DB, которая не выполняется, определяет, что таблицы нет, и выдает ошибку с ошибкой, прежде чем что-либо делать.

Кажется, что нет никакого способа отловить или игнорировать эту ошибку (например, я пытался увеличить MaximumErrorCount и различные различные настройки ErrorRowDescription) или остановить ее когда-либо, проверяя команду (ValidateExternalMetadataПохоже, это только влияет на дизайнера.)

У меня нет доступа к созданию хранимых процедур для переноса этого вида теста, а команды OLE DB не позволяют использовать префиксы IF OBJECT_ID('') IS NOT NULL для любых операторов.вы делаете (в данном случае, DELETE FROM TableName WHERE X = ?).

Есть ли другой способ, кроме использования компонента сценария для ручного запуска команды DELETE строка за строкой?

1 Ответ

2 голосов
/ 18 ноября 2011

Вы можете использовать компонент Script для выполнения оператора DELETE для каждой строки во входном пути, но это может быть очень медленно в зависимости от количества удаляемых строк.

Вы можете:

  1. Хранение PK записей, которые должны быть удалены в таблицу базы данных (например, TBL_TO_DEL)
  2. Добавление задачи «Выполнение SQL» с запросом SQL для удаления записей путем объединения TBL_TO_DEL с таблицей, из которой вы хотите удалить записи из
  3. Поместите ограничение приоритета на путь между вашим потоком данных и задачей «Выполнить SQL» (ограничение на основе вашей переменной)

Это решение намного быстрее, чем удаление строки за строкой.

Если по какой-либо причине Вы не можете создать новую таблицу, проверьте мой ответ на Источник данных Pass SSIS между задачами потока управления , чтобы увидеть другие способы передачи данных в следующий поток данных, где Вы можете использоватьИсточник OleDb и команда OleDb.Какой бы способ вы ни выбрали, ключ находится в ограничении, которое будет или не будет выполнять следующую задачу (выполнение задачи SQL или потока данных) в зависимости от значения в переменной.

Обратите внимание, что задача «Выполнение SQL» не будет проверять запрос и, как таковая, не будет выполняться во время выполнения, если ограничение выполнено и таблица не существует.Если вместо задачи «Выполнение SQL» используется другой поток данных, установите для свойства DelayedValidation значение true.Это означает, что задание будет проверено в момент до выполнения определенного задания, а не в любое время раньше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...