Как решить проблемы сопоставления параметров SQL-запроса при использовании поставщика Oracle OLE DB?
Вопрос
При попытке ввести SQL-запрос с параметрами с помощью поставщика Oracle OLE DB я получаю следующую ошибку:
Параметры невозможно извлечь из команды SQL.Поставщик может не помочь проанализировать информацию о параметрах команды.В этом случае используйте режим доступа «SQL-команда из переменной», при котором вся SQL-команда сохраняется в переменной.
ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ:
Поставщик не может получить информацию о параметрах, и SetParameterInfo не был вызван.(Поставщик Microsoft OLE DB для Oracle)
Я попробовал следовать предложению здесь, но не совсем понимаю, что требуется:Параметризованные запросы к Oracle
Есть идеи?
Решение
Чтобы расширить ссылку, указанную в вопросе:
- Создайте переменную пакета
- Дважды щелкните имя переменной пакета.(Это позволяет вам получить доступ к свойствам переменной)
- Установите для свойства EvaluateAsExpression значение true.
- Введите запрос в построитель выражений.
- Установите исходный запрос OLE DB на команду SQL из переменной.
Построитель выражений может динамически создавать выражения, используя переменную для создания «параметризированных запросов».
Итак, следующий «обычный» запрос:
select * from book where book.BOOK_ID = ?
В построителе выражений можно записать так:
"select * from book where book.BOOK_ID = " + @[User::BookID]
Затем вы можете выполнить обработку значений NULL и преобразование данных с помощью построителя выражений.
Другие советы
Если вы используете задачу потока данных и используете источник OLE DB, и вам необходимо параметризовать свой запрос:
- Создайте переменную для сохранения «Полного» оператора запроса:Щелкните правой кнопкой мыши пустую область за пределами пакета и выберите «Переменные»:
Нажмите «Добавить переменные» в окне «Переменные»:
Сделать имя SQL_DTFLOW_FULL
или что-то, что вы можете легко понять.А variable data type
является STRING
- Создайте переменную(и), чтобы сохранить параметры.
т. е. полный набор запросов:
SELECT * FROM BOOK WHERE BOOK_ID = @BookID --@BookID is SQL Parameter
в приведенном выше примере у меня есть только один параметр:@BookID, поэтому мне нужно создать одну переменную для сохранения моего параметра.Добавление дополнительных переменных зависит от ваших запросов.
Дайте ему имя SQL_DTFLOW_BOOKID
А variable data type
является STRING
Итак, вам нужно сделать вашу SSIS аккуратной, а переменные отсортировать по понятным частям.
Попробуйте сделать имя переменной SQL_{TASK NAME}_{VariableName}
- Сделайте выражение для
SQL_DTFLOW_FULL
переменной, нажмите на цифру 1 и начните заполнять цифру 2.Сделайте ваши операторы SQL правильными операторами SQL, используя блок строк.Строковый блок, обычно использующий «двойную кавычку» в начале и конце.Объедините переменные со строковым блоком.
Нажмите «Оценить выражение», чтобы отобразить результат. Чтобы убедиться, что ваш запрос верен, скопируйте и вставьте результат запроса в SSMS.
Убедитесь сами, что переменные не содержат SQL-инъекций, используя вашу собственную логику.(Используйте свой инстинкт разработчика)
- Откройте задачу потока данных, откройте редактор источника OLE DB, дважды щелкнув элемент.
- Выберите режим доступа к данным:
SQL Command From Variable
- Выберите имя переменной:
SQL_DTFLOW_FULL
- Нажмите «Предварительный просмотр», чтобы убедиться, что все работает.
Вот и все, мой способ предотвратить сбой SSIS.Поскольку я использую этот способ, у меня никогда не возникало такой проблемы, знаете, со SSIS что-то странное.
Чтобы изменить значение переменной, установите его перед задачей потока данных, результатом SQL SQL_DTFLOW_FULL
Переменная будет меняться каждый раз, когда вы меняете значение переменной.
В моем случае проблема заключалась в том, что у меня были комментарии в sql в обычной форме /* */, а также у меня были псевдонимы столбцов как «Имя столбца» вместо [Имя столбца].
Как только я их удалил, все заработало.
Также попробуйте получить свой параметр?в предложении WHERE, а не в JOINS, это тоже было частью проблемы.