2016-06-29 7 views
1

私はフラットファイル(.csv形式)にテーブルのデータをエクスポートする必要性を持っているフラットファイルにエクスポートテーブルデータ。テーブルに10000のレコードがある場合は、それぞれ5000レコードの2つのファイルを作成する必要があります。テーブルのレコードは毎日増加します。ですから、基本的には、「n」個のレコードを「n」個のファイルにそれぞれ5000レコードだけエクスポートする動的なソリューションを探しています。SSIS - 5000は、それぞれが記録のみ含むファイルのそれぞれとチャンク

*簡単な可視化: 表は10230件のレコードを持っていると仮定します。どのような私は必要である: - 5000から1レコードを

File_2.csv -

File_1.csv 10000レコードの

File_3.csvに5001 - 10001 10230への記録*

私はBCPを試してみました上記のロジックのコマンド。データフロータスクを使用してこれを行うことはできますか?

+0

この回答を見る[バッチエクスポートデータSSIS'](http://stackoverflow.com/questions/23323311/batch-export-data-ssis) –

答えて

1

いいえ、これは、SSISがネイティブによくサポートするものではありません。

先として働く

Aスクリプトタスク、またはスクリプトコンポーネント、これを実現することができますが、あなたが必要なすべてのファイルの処理とホイールの大部分を再発明しているはずです。

最初のステップは、反復様式でソースからのすべての行に行番号を追加することであろう。 SELECT *, ROW_NUMBER() OVER (ORDER BY MyTablesKey) AS RN FROM dbo.MyTable

これで、各行に単調に増加する値が関連付けられているので、ForEachアプローチを採用すると、referenced答えを使用して特定の範囲内のデータをプルできるようになりました。

あなたは、あなたがあなたのグループのサイズを指定するには、分析機能の一部を使用することができ、あなたが持っていると思いますどのように多くのデータのバケツ/ファイル上で、合理的な上限を作ることができれば。その後、すべてのデータがデータフローに供給され、フラットファイルの宛先に向かって出力バッファの上限値を持つ条件付き分割が発生します。

別の方法として、ファイルをそのままエクスポートしてから、PowerShellのようなものを使用して小さな単位に分割する方法があります。 Unixはちょうどこのようなことのためのネイティブメソッドとしてsplitを持っているのでいいです。

+0

あなたの提案をありがとう。私は最初に行番号を取得し、SQLのBETWEEN句で値を渡すROW_NUMBER()関数を使用しています。だから私のクエリはあなたが言ったものに似た何かになるでしょう:) – intel0201

0

まあ、それは標準のSSISコンポーネントANS SQL 2012+で行うことができます。次のようなアイデアがあります。バケットソースとしてSELECT ... ORDER BY ... OFFSET <Row offset> ROWS FETCH NEXT <Row number> ROWSを使用し、FORコンテナとフラットファイル送り先と一緒に式を使用します。
詳細:

  1. 0の初期化値と接続文字列は `「\は、ファイル名_」+ [ユーザー::イテレータ] +」の表現として定義されているフラット・ファイルの出力先とイテレータint型の変数を持つパッケージを作成します。 csv "と表示されます。また、Bucket_size変数またはパラメータをintとして定義します。
  2. Forループシーケンスコンテナを作成します。今はそのパラメータを空のままにしておきます。次のステップはFor Loopの内部にあります。
  3. ループ・コンテナ(またはパッケージ・レベル - あなた次第)は、"SELECT count(*) FROM ... ORDER BY ... OFFSET "+(DT_WSTR,20)[User::Iterator]*[User::Bucket_Size]+" ROWS "でSQL_rowcount変数を作成します。このコマンドは、現在のバケットに残りの行数をカウントします。
  4. タスクの作成SQL_rowcount変数からコマンドを使用してSQLコマンドを実行し、単一の結果を変数B​​ucket_Rowcountに格納します。
  5. "SELECT .. FROM ... ORDER BY ... OFFSET "+(DT_WSTR,20)[User::Iterator]*[User::Bucket_Size]+" ROWS FETCH NEXT "+(DT_WSTR,20)[User::Bucket_Size]+" ROWS"の文字列変数SQL_bucketを作成します。
  6. ステップ1のSQL_bucket変数とフラットファイルの出力からの単純なデータフロータスク - OLEDBソースを作成します。
  7. ここで少しのトリック - ループ条件を定義する必要があります。現在のバケットの行数に基づいて行います。最後のバケットはバケットサイズの行を超えません。継続条件(ループエントリの前にチェックされます) - 最後の反復はバケット行以上です(次の反復では少なくとも1行残っています)。 @Bucket_Rowcount = @Bucket_Size + 1
  8. EvalExpression - - @Bucket_Rowcount> @Bucket_Size
  9. のAssignExpression - @Iterator = @Iterator + 1

  10. そこで、Forループコンテナ
    • InitExpressionの次のプロパティを定義します

これはそれです。
エクスポート中にソーステーブルが変更されない場合は、このテーブルを最適化できます。最初に(For Loopの前に)行の数を取り出し、バケットの数を計算し、この繰り返し回数を実行します。したがって、ループ内でselect count(*)文を繰り返さないようにします。

+0

- おかげで束。それは私のために働いた:) – intel0201

関連する問題