2

これは基本的な問題のように思えますが、私はこれに対する効率的な解決策を得るために何日も髪を引き裂いてきました。

サーバー上に値のルックアップテーブルがあり、C#スクリプトタスクを使用して読み取り、文字列にアセンブルします。この文字列を変数に書き込み、データフローのADO.NETデータソース(読み取りアクセス権しか持たない別のサーバーから)の大きなSQLクエリ内でWHEREパラメーターとして渡します。たとえば、この文字列は次のようになります

  ('Frank', 'John', 'Markus', 'Tom')

それをWHERE句として追加します。SQLクエリが4000文字を超えているため、ADO.NETデータソースの変数から直接読み取ることができず、'Expression'プロパティを使用してSQLを設定することもできません。SQL実行タスクを使用してクエリを実行し、結果をレコードセットにロードして、レコードセットをループすることもできますが、これは非常に非効率的です。

これを行うための最良の方法は何でしょうか?私の最終目標は、これらの結果を最初のサーバーのテーブル内に配置することです。

4

2 に答える 2

2

スクリプトコンポーネントをソースとして設定してみることができます。スクリプト内の変数と文字列は4000文字より長くなる可能性があるため、クエリを内部に収めることができます。

次の記事のようにコンポーネントをセットアップします。http://beyondrelational.com/modules/2/blogs/106/posts/11119/script-componentsource-part1.aspx これには、を使用してデータをフェッチしExecuteReader、スクリプトコンポーネントの出力:http://beyondrelational.com/modules/2/blogs/106/posts/11124/ssis-script-component-as-source-adonet.aspxこれには、接続を正しく取得する方法が記載されています。http://www.toadworld.com/platforms/sql-server/b/weblog/archive/2011/05/30/use-connections-properly-in-an-ssis-script-task

この情報を結合することにより、動的に構築された任意の長さのクエリを使用してデータをフェッチできるソーススクリプトコンポーネントを記述できるようになります。

幸運を :)

于 2012-10-22T23:48:05.260 に答える
0

簡単なselectステートメントを実行して、を含む値のリストを返すことができます('Frank', 'John', 'Markus', 'Tom')。だからあなたselectは戻るでしょう:

Name
----------
Frank
John
Markus
Tom

次に、SSISで、メインクエリのwhere句の代わりにMerge Join Component(として機能する)を使用します。INNER JOIN

これは、あなたが望むものを達成するための最もクリーンな方法です。

于 2012-10-23T13:22:53.040 に答える