4

フラット ファイルから 100 万行をロードする SSIS パッケージを実行しています。これは、複雑な変換と SQL Server テーブルの変換先にスクリプト タスクを使用します。私は、データフロー処理中に別のテーブルに行数を書き出すための最良の方法 (この段階では任意の方法) を見つけようとしています (おそらく、より効率的にするために 1000 の倍数で)。これは、定期的にテーブルにクエリを実行するだけで、数分かかるタスク全体の進行状況のパーセンテージを判断できるようにするためです。

フローに SQL タスクを追加できないようです。そのため、唯一の方法は .NET スクリプト内で SQL データベースに接続することだと推測しています。これは苦痛に思えますし、それが可能かどうかさえ確信が持てません。別のよりエレガントな方法はありますか?「Rows Read」パフォーマンス カウンターへの参照を見てきましたが、SSIS でこれにアクセスする場所がわかりません。また、データ フロー処理中に SQL テーブルに書き込む方法もわかりません。

任意の提案をいただければ幸いです。

グレン

4

5 に答える 5

4

ここには2つの簡単なオプションがあります。

オプション1:SSISで組み込みのロギングを使用し、進行中のイベントを監視します。これは、リレーショナルデータベースやフラットファイルなど、いくつかの異なる出力にログを記録するように構成できます。

詳細はこちら

オプション2:データベーステーブルなどの外部システムに通知を送信できるSSISスクリプトコンポーネントを追加できます

于 2009-09-26T03:28:44.793 に答える
4

私は最近、これを少し異なる方法で解決しました。これは、スクリプトを使用してコードで DB への個別の接続を開くよりも優れていることがわかりました。

  • ソース クエリまたは変換図形で、行数を追加します (増分)
  • 条件分岐では、モジュロ式 (%) を使用して、数値が 1000 の倍数などの場合に分岐しますが、これは構成可能であるか、ソース データに基づいている可能性があります (たとえば、データの 0.0% から 100.0%)。
  • ログ接続マネージャーを作成し、宛先を使用します。行がすぐにターゲット テーブルにコミットされるように、バッチ処理のサイズを制御します。
于 2012-02-07T20:41:31.623 に答える
1

.NET アプリケーションを作成して、それに統合して、SSIS パッケージの場所に関する情報を取得してみませんか。

基本的に、コンソールに送信されるすべてのものを取得できます。また、パッケージの処理中に情報を取得するためにアタッチできるイベント ハンドラーがあります。

このアプローチに役立つリンクは次のとおりです 。 http://www.programminghelp.com/database/sqlserver/sql-server-integration-services-calling-ssis-package-in-c/

于 2009-09-25T03:37:59.743 に答える
1

OK、ついに成功しました....スクリプトコンポーネントに次のサブルーチンへの呼び出しを追加しました:

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% で最後に制御フローで再度更新されるため、既に存在していました。

皆さんの提案に感謝します。

于 2009-10-01T04:20:37.693 に答える
0

行数を消費するアプリケーションは .net アプリケーションですか? アプリケーション間で情報を共有することに関しては、多くの慣行が認められています。あなたはそれらに目を向けるべきかもしれません。また、特定のケースで、進行状況を計算するためにこの行番号を使用するのが .net アプリケーションである場合、ファイル システム、Web サービス、Windows 環境変数、ログなど、DB テーブル以外の場所に情報を保存できる可能性があります ( Windows イベント ログなど) などは、今頭に浮かんだものです。スクリプトコンポーネントで行カウントフォームを使用してWindows環境変数を更新すると、十分な解決策になると思います。グローバル変数を使用して、プログラム内の 2 つの関数間でデータを共有するのと同じです。:)

于 2009-09-27T06:03:13.873 に答える