Я пытаюсь удалить (и обновить, но если я смогу удалить, то смогу обновить) данные продукта из базы данных веб-сайта MySQL с помощью SSIS, когда эти продукты были отмечены в нашей ERP (и в базе данных sql server используется для отчетности) как прекращено. Я пробовал следующее:
Первая попытка: Сохранение строк, подлежащих удалению, в набор записей и использование цикла for-each с задачей выполнения sql для их удаления как описано здесь.
Результат: Частично работает, но работает очень медленно и дает сбой примерно после 500 удалений каждый раз. Это заставляет меня задуматься, есть ли в базе данных MySql какая-то функция защиты от хакеров.
Вторая попытка: Преобразование первичного ключа для всех строк, подлежащих удалению, в строковую переменную, разделенную запятыми, с использованием FOR XML PATH: как описано здесь (или, скорее, их серии из-за ограничения в 4000 символов).
Код выбора SQL (отлично работает)
WITH CTE (Product_sku,rownumber) AS
(
SELECT product_sku
, row_number() over(order by product_sku)
FROM product_updates
WHERE action = 'delete'
)
SELECT
Delete1= cast(
(SELECT TOP 1
STUFF(
(SELECT ',''' + product_sku+'''' FROM CTE
WHERE cte.RowNumber BETWEEN 1 and 700
FOR XML PATH (''))
, 1, 1, '') )
AS varchar(8000))
... and nine more of these select statements into additional variables to allow for larger delete operations.
А затем используя этот результат для удаления записей из MySql с помощью команды Execute SQL со следующим кодом:
DELETE FROM datarepo.product
WHERE product_sku in (?)
Результат: Пакет выполнен, но ничего удалить не удалось. При просмотре файла журнала запросов MySql я увидел следующее, в котором говорится, почему ничего не удалось удалить.
DELETE FROM datarepo.product
WHERE product_sku in ('\'')
Обратите внимание, что этот же оператор SSIS Execute SQL при использовании жестко заданных значений (например, следующих) удаляет просто отлично.
DELETE FROM datarepo.product
WHERE product_sku in ('1234','5678','abcd', etc...)
Мне не удалось найти ничего другого в Интернете. Как сказал Реза Рад в первом сообщении по ссылке, трудно найти материал об использовании SSIS для выполнения операций с MySql.
Спасибо, Джастин - не могу поверить, что не подумал о твоем первом предложении. Пока работает!
Ты идешь правильным путем. Самый простой способ - вставить коды продуктов в mysql в новую созданную таблицу с одним столбцом, а в SSIS 'SQL Task' просто присоединиться к таблицам и удалить эти записи ... Если это невозможно, я, вероятно, сгенерирую sql-запрос с SKU и используя «SQL Task», как вы будете его генерировать, зависит от того, что будет работать, а что нет. Вероятно, вам нужно использовать переменную SSIS, есть ограничение, проверьте Интернет на предмет обхода, я думаю, должно быть решение. Это не ответ, просто решение, куда идти.