Передать параметры в 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 через шоу план выполнения.