Каков синтаксис для выполнения параметризованного удаления с использованием объединений в SSIS 2008?

#tsql #ssis #sql-delete

#tsql #ssis #sql-удалить

Вопрос:

Я пытаюсь использовать команду OLE DB для выполнения удаления с использованием данных из каждой строки моего входного файла. Фактический запрос отлично работает при запуске вручную в sql server (заданный TableB.otherID сравнивается с int), но у меня возникают проблемы с его параметризацией.

 delete tableA from tableA
where tableA.ID = ?
  

Приведенный выше запрос выполняется и позволяет мне назначить один из моих входных столбцов для tableA.ID . Это то, чего я ожидал.

Попытка

 delete tableA from tableA 
INNER JOIN tableB ON tableB.ID = tableA.ID
where tableB.OtherID = ?
  

Однако выдает ошибку («Таблица идентификаторов из нескольких частей b.Не удалось привязать OtherID»). Жесткое кодирование значения вместо ‘?’ предотвращает появление этой ошибки.

Похоже, что это был бы правильный синтаксис, есть ли что-то неправильное в приведенном выше?

Ответ №1:

Похоже, это ошибка / ограничение в SSIS, я обнаружил, что не могу выполнить аналогичные параметризованные инструкции обновления с использованием объединения.

Решение, которое я в конечном итоге использовал, заключалось в создании временной хранимой процедуры с помощью инструкции delete, которую я хотел, и передаче параметра ей напрямую.

Ответ №2:

Я думаю, что синтаксис TSQL, который вы хотите, это:

 DELETE FROM tableA 
FROM tableA INNER JOIN tableB ON tableB.ID = tableA.ID 
WHERE tableB.OtherID = ? 
  

Комментарии:

1. Это правильный TSql, и он должен работать в любом обычном случае. Приведенное выше по-прежнему выдает ту же ошибку при использовании в SSIS, хотя, возможно, это кажется причудой технологии?

Ответ №3:

 DELETE FROM tableA 
FROM tableA INNER JOIN tableB ON tableB.ID = tableA.ID 
WHERE tableB.OtherID = @OrderId
  

Где @OrderID должна быть вашей переменной в SSIS.

Комментарии:

1. Это будет выполняться один раз для каждой строки в моем входном наборе данных, при этом значение сравнивается с изменяющимся каждый раз. Я полагаю, вы имеете в виду задачу Execute SQL в потоке управления, где ваше решение будет работать, вместо команды OLE DB в потоке данных.

Ответ №4:

В зависимости от того, сколько строк вам нужно удалить с помощью задачи Execute Sql, скорость довольно быстро замедляется.

Если это произойдет, решение, которое сработало для меня, заключается в том, чтобы поместить ключи строк, которые необходимо удалить, в промежуточную таблицу, затем, когда они все будут там, выполните одну инструкцию, которая удаляет все эти строки в одной инструкции и очищает промежуточную таблицу. Это намного быстрее, дополнительным преимуществом является то, что вам не нужно использовать quirky? синтаксис. Мне это никогда не нравилось, слишком легко что-то перепутывать, когда sql становится немного сложнее.

С уважением Герт-Ян