2014-09-25 4 views
7

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

У меня есть две переменные, переменная1 типа данных Дата Время и значение переменной задается выражением DATEADD("day", -1, GETDATE()). variable2 типа данных Дата Время и значение переменной задается выражением 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) 

Я сопоставляются параметры, как

Parameter0, User :: Variable1, вход

параметр1, User :: Variable2, вход

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

"There was an error displaying the preview

Additional Information: No Value given for one or more required parameters. (Microsoft SQL Server Native Client 11.0)"

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

[OLE DB Source [38]] Error: SSIS Error Code DTS_E_OLEDBERROR. An OLE DB error has occurred. Error code: 0x80040E21. An OLE DB record is available. Source: "Microsoft SQL Server Native Client 11.0" Hresult: 0x80040E21 Description: "Invalid character value for cast specification".

Примечание: тип_данное для столбца coldate является DateTime

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

+0

Синтаксис DATEADD: 'DATEADD (день, -1, GETDATE())' –

+0

Я получаю сообщение об ошибке, если я использую синтаксис DATEADD (день, -1, GETDATE()) в SSIS. http://msdn.microsoft.com/en-us/library/ms141719.aspx – Sezera

+0

Если ColDate является datetime, почему вы преобразовываете свои параметры в varchar в свой запрос? Что произойдет, если вы выберете функции преобразования? –

ответ

1

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

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

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

SSIS Variable Пример выражения:

(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 через план выполнения показа.

+0

спасибо. Я попробовал ваше решение, и это сработало – Sezera

+0

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

 Смежные вопросы

  • Нет связанных вопросов^_^