0

Я разрабатываю и тестирую пакет SSIS в SQL 2012 для импорта строк из текстового файла в промежуточную таблицу (которая усекается перед каждым исполнением) с использованием задачи сценария , Затем для выполнения хранимой процедуры используется задача Execute SQL, которая затем запрашивает промежуточную таблицу и форматирует данные для вставки в финальную таблицу.Сохраненная процедура завершается с ошибкой в ​​выполнении задачи SQL, но успешно выполняется вручную

В настоящее время я тестирую только два разных файла. Эти файлы представляют собой отдельные электронные письма, полученные ежедневно, которые я настроил в Outlook для сохранения в виде текстовых файлов. Каждый файл переименовывается как YYYYDDMM_HHMMSS_ [filename] .txt. В моем пакете SSIS используется цикл For Each для назначения этого имени файла переменной @AckFileName, которую я передаю в свою хранимую процедуру и анализирую файл datetime из него.

Таким образом, первая линия моей хранимой процедуры:

SELECT DISTINCT CONVERT(datetime,left(@AckFileName,8)+' '+substring(@AckFileName,10,2)+':'+substring(@AckFileName,12,2)+':'+substring(@AckFileName,14,2)) 

Когда я запустить хранимую процедуру в SSMS она работает правильно:

Exec [dbo].[ParseAckFile] @AckFileName 

Однако, несмотря на то, у меня есть один и тот же идентичный код для моего SQL-запроса в моей задаче Execute SQL я получаю следующую ошибку:

"Exec [dbo].[ParseAckFile]..." failed with the following error: "Conversion failed when converting date and/or time from a character string." 

Хорошо, так что это кажется простым/очевидным ... кроме запроса в моей хранимой процедуре является преобразование строки в datetime, поэтому она также должна возвращать ошибку при запуске вручную, правильно? Я тестировал это с каждым файлом, и результаты были одинаковыми - proc работает отлично вручную с любым файлом, но задача Execute SQL завершается с ошибкой.

Дополнительно: Я попытался установить проверку задержек = True в рамках задачи Execute SQL с использованием подключения OLEDB или ADO.NET к моей финальной таблице и использования выражения в задаче Execute SQL для построения моего запроса. Ни одна из этих попыток не имела никакого значения для сообщения об ошибке, которое я получаю.

Любые другие предложения, которые я могу попробовать?

+0

Вы пробовали просматривать трассировку профилировщика, чтобы убедиться, что ваш пакет SSIS отправляет значение параметра, которое, по вашему мнению, является? –

+0

Да @TabAlleman, имя файла в параметре - это тот, который я ожидаю. Я только что что-то обнаружил, но для тестирования я жестко закодировал имя файла в сохраненном proc, а затем удалил параметр из моей команды Execute SQL. Он работал правильно. Теперь мне интересно, хотя хотя мой параметр - Varchar, если мне может понадобиться инкапсулировать его в одиночные кавычки внутри proc? Мне нужно сделать больше тестов ... –

ответ

0

Проведя все послеобеденное тестирование, я, наконец, выяснил, в чем проблема ... Поскольку цикл «Мой каждый» возвращал имя файла, которое я, в конечном счете, передавал в эту хранимую процедуру, содержал полный UNC-путь/имя для файл, который я знал. Однако при просмотре значения переменной в SSIS он показал путь в формате, используемом в моей задаче скрипта - \\ [server \ [папка \ [подпапка] \ [имя файла]), поэтому я ошибочно использовал этот точный синтаксис в моей команде REPLACE в пределах сохраненный proc для обновления переменной @AckFileName перед передачей его в мой запрос на вставку. Как только я выяснил свою ошибку и исправил ее, пакет работает нормально!

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