Регистрация информации при удаленном выполнении служб SSIS из ASP.NET - PullRequest
0 голосов
/ 04 октября 2011

У меня есть веб-сервер (службы Integration Services не установлены) и отдельный сервер SQL. Я создал страницу ASP для удаленного выполнения пакета служб SSIS, запустив задание агента на сервере SQL, на котором находится пакет. Пакет читает файл excell, выбранный пользователем веб-страницы, обрабатывает данные и сохраняет результаты в базе данных.

У меня такой вопрос: что было бы хорошим подходом для возврата к данным регистрации страниц ASP от SSIS во время выполнения, чтобы у пользователя была некоторая разумная информация о результатах его запроса?

1 Ответ

2 голосов
/ 04 октября 2011

В качестве первого шага я бы предложил включить собственную регистрацию в 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

Затем вы можете связать результаты регистрации с определенным файлом (ами)

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+ и в основном сбрасывают вещи прямо в таблицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...