В качестве первого шага я бы предложил включить собственную регистрацию в SSIS и выгрузить ее в место назначения SQL Server. Речь идет о процессе 8 щелчков, поэтому на самом деле нет причин не включать его. Возьмите OnTaskFailed, OnError, возможно OnInformation и OnWarning, в зависимости от того, какую информацию вы хотите вернуть пользователю.
Как только это будет сделано, когда пакет запустится, если в выбранной вами базе данных еще нет таблицы, SSIS достаточно умен, чтобы сделать копию msdb.dbo.sysdtslog90 / msdb.dbo.sysssislog (2005/2008) +) в этой базе данных и начать запись в нее.
На этом этапе ваше задание выполнено, история выполнения автоматически выгружается в эту таблицу журнала, и вы можете извлечь эту информацию. Когда задание выполняется, генерируется новый GUID, и этот ExecutionId позволяет связать все действия определенного запуска вместе.
Я не уверен, как вы передаете информацию в задание о том, какой файл Excel обрабатывать, возможно, вы не разрешаете одновременное выполнение, и одновременно может быть запущен только один файл. Если это так, то вы всегда можете запросить самое последнее выполнение в журнале и предположить, что он связан с пользователем на сайте.
В противном случае, я бы, вероятно, посмотрел бы на что-то вроде выдачи уникального имени файла в журнале [Задача сценария, ~ Dts.Events.FireInformation (String.Format ("FileName: {0}", Dts.Variables [MyExcelCM]). .Name.ToString ()), ...);] и затем выполнить какое-то вуду, чтобы проанализировать журнал, предполагая, что вы не можете просто создать имя файла для таблицы выполнения с идентификатором выполнения, что было бы более чистым средством привязки выполнения к конкретному файлу, который позволит вам вернуться к syssisslog.
Редактировать
CREATE TABLE
dbo.ExecutionToFileMapping
(
mapping_id int identity(1,1) NOT NULL PRIMARY KEY
, executionid uniqueidentifier NOT NULL
, file_name varchar(250) NOT NULL
)
Внутри пакета перетащите задачу «Выполнение SQL» в поток управления и укажите диспетчер соединений на базу данных с приведенной выше таблицей. Ваш запрос будет выглядеть так
INSERT INTO dbo.ExecutionToFileMapping (executionid, file_name) SELECT ?, ?
На вкладке «Сопоставление параметров» подключите локальную переменную, которая соответствует имени файла Excel, а затем используйте системную переменную ExecutionInstanceGUID. Когда этот оператор сработает, он сделает запись в таблицу с GUID выполнения и именем файла.
![enter image description here](https://i.stack.imgur.com/uvFPM.png)
Затем вы можете связать результаты регистрации с определенным файлом (ами)
SELECT
E.file_name
, L.*
FROM
dbo.sysssislog L
INNER JOIN
dbo.ExecutionToFileMapping E
ON E.executionid = L.executionid
конец редактирования
Наконец, насколько мне нравится SSIS, использование Excel в качестве источника данных - это рецепт большого разочарования, особенно когда речь идет о созданных пользователем электронных таблицах. Я не могу сосчитать количество случаев, когда «электронные таблицы выглядят одинаково», но службы SSIS показали, что формат был другим. У меня был намного лучший опыт, когда я просто запрашивал Excel через OLEDB, как в этом вопросе SO обсуждается Запрос таблицы Excel в c # В зависимости от вашей версии SQL Server, я бы тогда воспользовался табличным значением параметры в 2008+ и в основном сбрасывают вещи прямо в таблицы.