2009-09-25 2 views
4

Я запускаю пакет SSIS для загрузки, скажем, миллион строк из плоского файла, который использует задачу сценария для сложных преобразований и назначения таблицы SQL Server. Я пытаюсь найти лучший способ (ну, ЛЮБОЙ путь на этом этапе), чтобы выписать в другую таблицу количество строк (возможно, в тысячах 1000, чтобы быть более эффективным) ВО ВРЕМЯ обработки потока данных. Это так, что я могу определить процент прогресса во время выполнения задачи, которая может занять несколько минут, просто путем периодического запроса таблицы.Измерение прогресса потока данных SSIS

Я не могу добавить SQL-задачи в поток, поэтому я предполагаю, что единственный способ - подключиться к базе данных SQL внутри сценария .NET. Это кажется болезненным, и я даже не уверен, что это возможно. Есть ли еще более элегантный способ? Я видел ссылку на счетчик производительности Rows Read, но не уверен, где я получаю доступ к этому в SSIS и до сих пор не знаю, как записать его в таблицу SQL во время обработки потока данных.

Любые предложения оценены.

Гленн

ответ

1

ОК, имели некоторый успех в прошлом .... добавила вызов к следующим подразделам в компоненте сценария:

Sub UpdateLoadLog(ByVal Load_ID As Int32, ByVal Row_Count As Int32, ByVal Row_Percent As Int32, ByVal connstr As String) 
    Dim dbconn As OleDbConnection 
    Dim Sql As String 
    Dim dbcomm As OleDbCommand 

    dbconn = New OleDbConnection(connstr) 
    dbconn.Open() 
    Sql = "update myTable set rows_processed = " & Row_Count & ", rows_processed_percent = " & Row_Percent & " where load_id = " & Load_ID & " and load_log_type = 'SSIS'" 
    dbcomm = New OleDbCommand(Sql, dbconn) 
    dbcomm.ExecuteNonQuery() 

    dbconn.Close() 
    dbconn = Nothing 
    dbcomm = Nothing 
End Sub 

Это запускается на выполнении каждые 1000 строк, и успешно обновляет таблицу. Строка уже существовала, поскольку она создается в потоке управления в начале пакета и снова обновляется в потоке управления в самом конце с окончательным числом строк и 100%.

Спасибо за все ваши предложения, ребята.

1

Почему бы не написать приложение .NET, и вы можете интегрировать в том, что, чтобы получить информацию о том, где пакет SSIS находится.

В принципе, все, что отправляется на консоль, вы можете получить, и есть обработчики событий, с которыми вы можете подключиться, чтобы получать информацию во время обработки пакета.

Вот ссылка, которая может помочь вам идти с этим подходом: http://www.programminghelp.com/database/sqlserver/sql-server-integration-services-calling-ssis-package-in-c/

4

есть два простых варианта здесь:

Вариант 1: использовать встроенный вход с SSIS и смотреть на прогресс. это может быть настроено на вход в нескольких различных выходах, включая реляционную базу данных и плоские файлы

Смотреть еще Here

Вариант 2: вы можете добавить компонент сценария служб SSIS, который может сгореть от уведомлений внешней системы как таблицы баз данных

+1

Ну, его вопрос заключается в том, как это сделать. Не так ли? – Faiz

+0

Джейсон, спасибо. Я заглянул в журнал. К сожалению, событие OnProgress срабатывает ONCE, когда поток данных начинается, а затем никогда больше. Я не вижу другого события, которое срабатывает в каждой строке или каким-либо другим образом постоянно во всем потоке данных. Я начинаю думать, что вариант 2 - это возможность. Можете ли вы предложить какой-то код для подключения. Ловушка заключается в том, что в потоке данных есть объектная модель «откинутая назад». Такие вещи, как ДТС. объект просто не существует, как в потоке управления. Полезно, я знаю. Поэтому получить соединение с базой данных для работы сложно. Какие-либо предложения? –

+0

Просмотреть последние обновления ниже ... –

0

Является ли приложение потребляющим количество строк в приложении .net? Когда дело доходит до обмена информацией между приложениями, существует множество принятых практик. Может быть, вам стоит взглянуть на них. И для вашего конкретного случая, если это приложение .net, которое использует этот номер строки для вычисления прогресса, может быть, вы можете хранить информацию в другом месте, отличном от таблицы БД, например файловой системы, веб-службы, переменных среды Windows, журнала (как журнал событий Windows) и т. д. некоторые из них пришли мне в голову. Я думаю, что обновление переменной окружения Windows с формой подсчета строк с помощью компонента скрипта будет достаточно хорошим решением. Точно так же, как использование глобальной переменной для обмена данными между двумя функциями внутри программы. :)

3

Недавно я решил это в несколько иной манере, которую я найти выше с помощью сценариев и открытия отдельных соединений в коде DBS:

  • В запросе источника или преобразование формы, добавить количество строк (incremental)
  • В условном ветвлении используйте выражение модуляции (%) для разветвления, когда число кратно 1000, но это может быть конфигурируемо или основано на исходных данных (например, от 0,0% до 100,0% от data)
  • Создайте диспетчер соединений с журналом и используйте пункт назначения. Контролируйте размеры дозирования, чтобы строки сразу были привязаны к целевой таблице.
Смежные вопросы