Передать параметры в OLE DB SOURCE

Я новичок в SSIS и у меня возникают проблемы при передаче параметров в OLE DB Source. Я хочу запросить данные для заданного диапазона дат.

У меня есть две переменные, variable1 типа данных Date Time и значение переменной задается выражением DATEADD("day", -1, GETDATE()), переменная2 типа данных Дата Время и значение переменной задается выражением DATEADD("day", 0, GETDATE())

Внутри ИСТОЧНИКА OLE DB режим доступа к данным установлен на команду SQL, ниже приведен код SQL.

Select Col1, col2, col3, col4, coldate where Col1 = 'abc' and  coldate between convert(varchar(10), ?, 101) and convert(varchar(10), ?, 101)

Я сопоставил параметры как

Параметр0, Пользователь:: переменная1, вход

Параметр1, Пользователь:: переменная2, вход

Когда я нажимаю на превью, я получаю сообщение об ошибке

"При предварительном просмотре произошла ошибка

Дополнительная информация: значение не указано для одного или нескольких обязательных параметров. (Собственный клиент Microsoft SQL Server 11.0)

Когда я отлаживаю задачу, я получаю ошибку

[Источник OLE DB [38]] Ошибка: код ошибки служб SSIS DTS_E_OLEDBERROR. Произошла ошибка OLE DB. Код ошибки: 0x80040E21. Доступна запись OLE DB. Источник: "Собственный клиент Microsoft SQL Server 11.0". Hresult: 0x80040E21 Описание: "Недопустимое значение символа для спецификации приведения".

Примечание: тип данных для столбца coldate - datetime

Пожалуйста, помогите мне решить эту проблему. Мне удалось успешно выполнить запрос с помощью команды SQL режима доступа к данным из переменной внутри источника OLE DB, но меня попросили не использовать режим доступа к данным в качестве команды SQL. Спасибо.

1 ответ

Если вы уверены, что правильно отображаете переменные, я бы предложил следующее:

SSIS использует свои собственные типы данных. В прошлом у меня были проблемы с работой с SSIS datetime, поэтому всякий раз, когда я передаю переменные в операторы TSQL из SSIS, я стараюсь работать только со строками (если это вообще возможно).

Я рекомендую настраивать ваши переменные в SSIS в виде строк, которые получают значения даты, которые вы пытаетесь отфильтровать, отформатированные как таковые. Вы можете выполнить преобразование в строку в SSIS в том же операторе, который вы в настоящее время используете для реализации ваших операторов dateadd.

Пример выражения переменной SSIS:

(DT_STR,4,1252) DatePart("yyyy",dateadd("day", -1, getdate())) + "-" +
Right("0" + (DT_STR,4,1252) DatePart("m", dateadd("day", -1, getdate())),2) + "-" +
Right("0" + (DT_STR,4,1252) DatePart("d", dateadd("day", -1, getdate())),2)  

Затем упростите свой оператор TSQL следующим образом:

Select Col1, col2, col3, col4, coldate 
where Col1 = 'abc' 
and coldate between ? and ?

Примечание. Когда вы передаете свой оператор TSQL таким образом. SQL Server знает, что при использовании столбца даты и оператора Между границы, передаваемые в виде строк, должны быть преобразованы в тип столбца сервера SQL Datetime. Промежуточный интервал будет по-прежнему использовать правильные индексы, если они доступны. Он не становится жертвой неявных преобразований, которые могут помешать правильному выбору индекса в других запросах, которые получают неправильные типы для сравнения. Вы можете проверить это в SSMS через шоу план выполнения.

Другие вопросы по тегам