Службы интеграции SQL Server - добавление параметра в оператор SQL - PullRequest
3 голосов
/ 13 января 2010

У меня есть проект служб SQL Server Integration Services, который запрашивает базу данных SQL Server 2005, используя источник OLE DB с командой SQL в качестве режима доступа к данным.

Я пытаюсь параметризовать свой SQL-запрос, но синтаксис не @PARAM, и когда я пытаюсь использовать? и нажмите на параметры, я получаю сообщение об ошибке, говорящее, что «Параметры не могут быть извлечены из команды SQL».

Я делаю что-то вроде

SELECT * FROM [dbo].[TabledValuedFunction] (?)

Ответы [ 5 ]

7 голосов
/ 14 января 2010

При создании динамического оператора SQL мне повезло больше с использованием выражений. Поэтому в этом гипотетическом случае я бы создал 2 переменные Qry1 и Qry1Param1.

Внутри переменной Qry1 я бы использовал редактор выражений, чтобы создать нечто, похожее на

"SELECT * FROM [dbo].[TabledValuedFunction] where tbl_key = " +   @[User::Qry1Param1]

Переменная Qry1Param1 будет выглядеть примерно так: 1.

Так что Qry1 оценивается в

SELECT * FROM [dbo].[TabledValuedFunction] where tbl_key = 1

Затем вы можете изменить источник данных OLEDB для использования режима доступа к данным команды SQL из переменной и ввести переменную User :: Qry1.

1 голос
/ 17 ноября 2011

У меня была эта проблема, и это сводило меня с ума, что некоторые запросы будут работать, а другие не получатся. Для меня было решено удалить SELECT * и вместо этого явно указать столбцы. В некоторых других запросах мне пришлось удалить подзапросы. По сути, вы должны возиться с / упрощать свой запрос, пока поставщик OLEDB не сможет адекватно проанализировать всю информацию, необходимую для отображения информации о параметрах.

Почему провайдер OLEDB не может выдать более описательное сообщение об ошибке, чтобы людям не пришлось прибегать к обходным путям с переменными пакета ????

1 голос
/ 13 января 2010

Похоже, что соединение OLEDB не обеспечивает SSIS всем необходимым для определения типа данных параметров и т. Д., Поэтому оно не может правильно разобрать, каким оно должно быть (это предположение с моей стороны). Однако, как следует из сообщения об ошибке, всю команду SQL можно составить из переменной. Вам понадобится строковая переменная, которую вы установили перед потоком данных.

0 голосов
/ 16 января 2010

Как вы настроили свой компонент задачи execute sql? Я только что попробовал, и он отлично работает.

Я использовал эту функцию:

create function test1(@x int) 
returns @tbl table (x int)
as begin 
 while ( @x > 0 )
 begin
  insert @tbl values(@x);
  set @x-=1;
 end;

 return;
end;
go

Это моя настройка ExecSql.

Протестировано на MSSQL2008, SSIS2008.

0 голосов
/ 13 января 2010

Вы можете использовать переменные параметры в источнике ole db для предоставления динамической таблицы, динамического условного оператора или динамической SQL-статистики. Нажав на источник ole db, вы можете изменить режим доступа к данным. Ниже приведены примеры некоторых типов режимов доступа, в которых вы можете использовать переменные пакета:

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

параметризация условного оператора: используйте команду sql. Текст команды Sql будет выглядеть примерно так: Select * From Table Where id =?. Затем отобразите вашу переменную.

динамический sql в переменной: используйте команду sql из переменной. Затем вы можете поместить свой sql statment в строковую переменную пакета: Выбрать * Из таблицы

Я не был полностью уверен в том, что вы пытались параметризировать, поэтому я как бы дал вам представление о некоторых возможных вариантах, которые могут / могут не помочь вам в вашей конкретной проблеме. Надеюсь, это поможет.

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