SSIS 2008 Выполняет сопоставление выходных параметров SQL datetime2 проблема
-
22-08-2019 - |
Вопрос
Я пытаюсь использовать задачу Execute SQL в SSIS 2008 для сопоставления выходного параметра процедуры хранения с переменной пакета.
Переменная пакета имеет тип DateTime SSIS, а параметр процедуры хранения - тип DATETIME SQL.
Оператор SQL является EXEC GetCurrentDate @CurrentDate=?
и на экране сопоставления параметров параметр сопоставляется переменной пакета с указанным выводом направления и типом данных DBTIMESTAMP.
Когда я запускаю пакет, я получаю следующую ошибку:
Ошибка [Выполнить задачу SQL]:Выполнение запрос "EXEC GetCurrentDate" @currentDate=?" сбой из-за следующей ошибки:"Тип значения, присваиваемого переменной "User::currentDate" отличается от типа текущей переменной.Переменные могут не изменять тип во время выполнения.Типы переменных являются строгими, за исключением переменных типа Object.".Возможные причины сбоя:Проблемы с запросом, свойство "ResultSet" не задано правильно, параметры не заданы правильно или соединение не установлено установлено правильно.
Если я запускаю трассировку по выполняемому запросу, я вижу, что тип предполагается как datetime2:
declare @p3 datetime2(7)
set @p3=NULL
exec sp_executesql N'EXEC GetCurrentDate @CurrentDate=@P1 ',N'@P1 datetime2(7) OUTPUT',@p3 output
select @p3
Кто-нибудь знает, почему предполагается, что тип равен datetime2?
Спасибо
Решение
Нашел ответ в отчете об ошибке Micorsoft Connect:
Мы закрываем это дело, поскольку это ожидаемое поведение и является результатом нового изменения типа sql datetime.Вы используете собственный oledb connection manager для sql task, в процессе COM-взаимодействия мы используем VARIANT для хранения значения, и единственный способ предотвратить потерю данных - сохранить значение как BSTR variant.Если вы измените User::dateParam на строковый тип, это сработает, или вы можете переключиться на использование диспетчера управляемых подключений, чтобы обойти COM-взаимодействие.
Другие советы
Попробуйте указать входные / выходные параметры следующим образом DATE
вместо того , чтобы DBTIMESTAMP
в задаче SSIS.
Это, безусловно, работает в пакетах SSIS 2005, над которыми я работал.
На это также стоит обратить внимание эта ссылка, который охватывает это, а также пару других проблем, связанных с SSIS и датами.