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

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

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

Внутри OLE DB SOURCE для режима доступа к данным задана команда 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. Спасибо.


person Sezera    schedule 25.09.2014    source источник
comment
синтаксис для DATEADD: DATEADD(day, -1, GETDATE())   -  person Nagaraj S    schedule 25.09.2014
comment
Я получаю сообщение об ошибке, если использую синтаксис DATEADD(день, -1, GETDATE()) в службах SSIS. msdn.microsoft.com/en-us/library/ms141719.aspx   -  person Sezera    schedule 25.09.2014
comment
Если ColDate - это дата и время, почему вы конвертируете свои параметры в varchar в своем запросе? Что произойдет, если вы уберете функции преобразования?   -  person Tab Alleman    schedule 26.09.2014


Ответы (1)


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

SSIS использует собственные типы данных. В прошлом у меня были проблемы с работой с датой и временем SSIS, поэтому всякий раз, когда я передаю переменные операторам 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 знает, что при использовании столбца даты и оператора between границы, передаваемые в виде строк, должны быть преобразованы в тип столбца SQL Server datetime. Между ними по-прежнему будут использоваться правильные индексы, если они доступны. Он не становится жертвой неявных преобразований, которые могут помешать правильному выбору индекса в других запросах, получающих неправильные типы для сравнения. Вы можете протестировать это в SSMS с помощью плана выполнения show.

person RThomas    schedule 25.09.2014
comment
Хорошо - рад это слышать. Как я уже сказал, у меня также были проблемы с преобразованием типов данных SSIS. - person RThomas; 26.09.2014