Как решить проблемы сопоставления параметров SQL-запроса при использовании поставщика Oracle OLE DB?

StackOverflow https://stackoverflow.com/questions/58540

  •  09-06-2019
  •  | 
  •  

Вопрос

При попытке ввести SQL-запрос с параметрами с помощью поставщика Oracle OLE DB я получаю следующую ошибку:

Параметры невозможно извлечь из команды SQL.Поставщик может не помочь проанализировать информацию о параметрах команды.В этом случае используйте режим доступа «SQL-команда из переменной», при котором вся SQL-команда сохраняется в переменной.
ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ:
Поставщик не может получить информацию о параметрах, и SetParameterInfo не был вызван.(Поставщик Microsoft OLE DB для Oracle)

Я попробовал следовать предложению здесь, но не совсем понимаю, что требуется:Параметризованные запросы к Oracle

Есть идеи?

Это было полезно?

Решение

Чтобы расширить ссылку, указанную в вопросе:

  1. Создайте переменную пакета
  2. Дважды щелкните имя переменной пакета.(Это позволяет вам получить доступ к свойствам переменной)
  3. Установите для свойства EvaluateAsExpression значение true.
  4. Введите запрос в построитель выражений.
  5. Установите исходный запрос OLE DB на команду SQL из переменной.

Построитель выражений может динамически создавать выражения, используя переменную для создания «параметризированных запросов».
Итак, следующий «обычный» запрос:

select * from book where book.BOOK_ID = ?

В построителе выражений можно записать так:

"select * from book where book.BOOK_ID = " + @[User::BookID]

Затем вы можете выполнить обработку значений NULL и преобразование данных с помощью построителя выражений.

Другие советы

Если вы используете задачу потока данных и используете источник OLE DB, и вам необходимо параметризовать свой запрос:

  1. Создайте переменную для сохранения «Полного» оператора запроса:Щелкните правой кнопкой мыши пустую область за пределами пакета и выберите «Переменные»:

Variables

Нажмите «Добавить переменные» в окне «Переменные»:

enter image description here

Сделать имя SQL_DTFLOW_FULL или что-то, что вы можете легко понять.А variable data type является STRING

  1. Создайте переменную(и), чтобы сохранить параметры.

т. е. полный набор запросов:

SELECT * FROM BOOK WHERE BOOK_ID = @BookID --@BookID is SQL Parameter

в приведенном выше примере у меня есть только один параметр:@BookID, поэтому мне нужно создать одну переменную для сохранения моего параметра.Добавление дополнительных переменных зависит от ваших запросов.

ParamAdd

Дайте ему имя SQL_DTFLOW_BOOKID

А variable data type является STRING

Итак, вам нужно сделать вашу SSIS аккуратной, а переменные отсортировать по понятным частям.

Попробуйте сделать имя переменной SQL_{TASK NAME}_{VariableName}

  1. Сделайте выражение для SQL_DTFLOW_FULL переменной, нажмите на цифру 1 и начните заполнять цифру 2.Сделайте ваши операторы SQL правильными операторами SQL, используя блок строк.Строковый блок, обычно использующий «двойную кавычку» в начале и конце.Объедините переменные со строковым блоком.

Expression

Нажмите «Оценить выражение», чтобы отобразить результат. Чтобы убедиться, что ваш запрос верен, скопируйте и вставьте результат запроса в SSMS.

Убедитесь сами, что переменные не содержат SQL-инъекций, используя вашу собственную логику.(Используйте свой инстинкт разработчика)

  1. Откройте задачу потока данных, откройте редактор источника OLE DB, дважды щелкнув элемент.

Data Flow

  • Выберите режим доступа к данным: SQL Command From Variable
  • Выберите имя переменной: SQL_DTFLOW_FULL
  • Нажмите «Предварительный просмотр», чтобы убедиться, что все работает.

Вот и все, мой способ предотвратить сбой SSIS.Поскольку я использую этот способ, у меня никогда не возникало такой проблемы, знаете, со SSIS что-то странное.

Чтобы изменить значение переменной, установите его перед задачей потока данных, результатом SQL SQL_DTFLOW_FULL Переменная будет меняться каждый раз, когда вы меняете значение переменной.

В моем случае проблема заключалась в том, что у меня были комментарии в sql в обычной форме /* */, а также у меня были псевдонимы столбцов как «Имя столбца» вместо [Имя столбца].

Как только я их удалил, все заработало.

Также попробуйте получить свой параметр?в предложении WHERE, а не в JOINS, это тоже было частью проблемы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top