Оператор удаления не выполняется при вызове из служб SSIS - PullRequest
5 голосов
/ 05 марта 2019

Я пытаюсь организовать Snowflake из SSIS.

Я использую соединение ODBC и задачу «Выполнить SQL». Оператор усеченной таблицы работает нормально, и задача успешно завершается. Если изменить это на удаление, задача завершится с ошибкой ниже:

Сбой

со следующей ошибкой: «Ошибка HRESULT E_FAIL возвращена из вызова COM-компонента». Возможные причины сбоя: проблемы с запросом, свойство ResultSet установлено неправильно, параметры установлены неправильно или подключение установлено неправильно.

Из истории запросов в виде снежинки видно, что запрос успешно выполнен:

enter image description here

Я подозревал, что «результаты» выглядят для SSIS как набор результатов, когда он настроен на «нет». Я изменил это как на одну строку, так и на «полный набор результатов» в объект, но все равно получаю ошибки независимо от настройки.

Что мне нужно изменить, чтобы SSIS успешно выполнял операторы против Snowflake?

Edit:

Добавление моего оператора удаления:

delete from SUMMARY.Data_minutes
where date >= dateadd(day,-5  ,'2019-01-20' )
and date <= '2019-01-20' 

1 Ответ

1 голос
/ 06 марта 2019

Пытаясь выяснить проблему

При поиске этой проблемы я нашел кое-что интересное на этой странице поддержки Devart , где сообщалось о подобной проблеме:

Согласно документации Microsoft, если запрос не повлиял, никакие записи вернут результат SQL_NO_DATA (для спецификации ODBC 3.x).Наш драйвер и SSIS используют спецификацию ODBC 3.x, однако в описанном случае SSIS реализует поведение как ODBC 2.x.Вот почему при получении результата SQL_NO_DATA возвращается ошибка «Ошибка HRESULT E_FAIL возвращена из вызова компонента COM».

На основе Документация Microsoft :

Когда приложение ODBC 3.x вызывает SQLExecDirect, SQLExecute или SQLParamData в драйвере ODBC 2.x для выполнения поиска оператора обновления или удаления, который не влияет ни на какие строки в источнике данных,драйвер должен возвращать SQL_SUCCESS, а не SQL_NO_DATA.Когда приложение ODBC 2.x или ODBC 3.x, работающее с драйвером ODBC 3.x, вызывает SQLExecDirect, SQLExecute или SQLParamData с тем же результатом, драйвер ODBC 3.x должен вернуть SQL_NO_DATA.

Это означает, что если ни одна строка не соответствует следующему условию, оно выдаст исключение (в аналогичном случае: конфликт версий ODBC) :

where date >= dateadd(day,-5  ,'2019-01-20' )
and date <= '2019-01-20' 

Что-то попробовать

Сейчас я не могу проверить эти обходные пути, но вы можете попробовать два метода:

  1. добавить фиктивную строку выбора после команды удаления

    delete from SUMMARY.Data_minutes
    where date >= dateadd(day,-5  ,'2019-01-20' )
    and date <= '2019-01-20' 
    
    select 1
    
  2. создать хранимую процедуру, передать дату в качестве параметров и выполнить ее из задачи «Выполнение SQL» (также попробуйте добавить фиктивную команду выбора в конце хранимой процедуры)

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