2014-09-09 2 views
1

В моем пакете SSIS у меня есть задача выполнения SQL с двумя операторами. В основном это:Несколько операторов в SSIS Выполнение SQL-задачи

INSERT INTO table2 SELECT * FROM table1; 
TRUNCATE TABLE table1 

Первый оператор не выполнен (дубликаты записей). Но таблица1 пуста! Не понимаю ли я основные принципы баз данных ?! Я ожидал, что вся партия завершится неудачно, если первый оператор не сработает.

В отчете об исполнении ожидаются сообщения об ошибках: 1. Нельзя вставить дублируемую строку ключа. 2. Заявление было прервано. Возможные причины отказа бла-бла

Мой сервер SQL Server 2012 с пакетом обновления 2 CU1, соединение OLEDB

Там нет других усечь заявления для этой таблицы, известной мне. Я сошел с ума?

+0

Без явных транзакций для отката, почему одна земля, по вашему мнению, не будет рассматривать их как два отдельных независимых заявления? – HLGEM

+0

HLGEM, я всегда думал о транзакциях, как о возможности отката _прерывных операторов, не отменяющих выражения _following_. Я всегда плохо работал с обработкой ошибок. :( BTW, когда я добавляю GO после каждого утверждения, я получаю первоначально ожидаемое поведение. Но являются ли партии равными транзакциям? Это было бы еще большим сюрпризом для меня. – Esc

+0

партии не обязательно являются транзакциями. в 44-й книге. – HLGEM

ответ

2

Вам нужно поймать на ошибку ..

INSERT INTO table2 SELECT * FROM table1; 
IF @@ERROR = 0 
    TRUNCATE TABLE table1 
+0

Благодарим за предложение. Но мой главный вопрос: почему? Почему SQL Server не должен прерывать пакет при ошибке? Я пытался найти ответ в справке SQL Server, но не смог. – Esc

+1

Сценарий не останавливается когда он обращается к ошибке.Она будет продолжаться через код.Таким образом, первый оператор заключается в 'insert into ..'. Это не удается, а ошибка регистрируется и помещается в очередь. Он будет продолжен следующим оператором, который является' Truncate table table1'. Как только скрипт будет завершен, он будет запускать вызывающее приложение. – Tak

0

Хорошо, после некоторого тестирования я подтвердил, что это предполагаемое поведение. Возможные решения включают в себя:

  1. Использование IF @@ ERROR
  2. расщеплению линии в партии с GO (спасибо t_m!). Строки в пакете будут выполняться, но следующая партия не будет.
  3. Разделение линий на несколько задач (duh).
Смежные вопросы