Как решить проблемы с отображением параметров запроса SQL при использовании поставщика Oracle OLE DB? - PullRequest
9 голосов
/ 12 сентября 2008

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

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

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

Есть идеи?

Ответы [ 3 ]

18 голосов
/ 12 сентября 2008

развернуть по ссылке, указанной в вопросе:

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

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

select * from book where book.BOOK_ID = ?

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

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

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

1 голос
/ 24 сентября 2018

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

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

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

1 голос
/ 20 июля 2018

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

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

Variables

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

enter image description here

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

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

т. Е. Полный набор запросов Query:

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 будет меняться при каждом изменении значения переменной.

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