2013-10-29 15 views
5

SQLコマンドテキストにprocが格納されていますが、これにはテーブル名を含むパラメータが渡されています。 procはそのテーブルからデータを返します。私は、いくつかのビジネスロジックがprocで設定された結果に起こる必要があるため、OLE DBソースとしてテーブルを直接呼び出すことはできません。 SQL 2008ではこれはうまくいきました。アップグレードされた2012年のパッケージでは、「動的SQLが含まれているため、メタデータを特定できませんでした。結果セットを明示的に記述するにはWITH RESULT SETS句を使用することを検討してください。SSIS 2012のOLE DBソースで動的SQLを使用

問題は、パラメータとして渡されるテーブル名が異なる値になり、その結果のフィールドが毎回異なる可能性があるため、procでフィールド名を定義できないという問題です。誰でもこの問題に遭遇したり、何か考えがありますか?私は "dm_exec_describe_first_result_set"、一時テーブル、および結果セットを含むCTEを使用してダイナミックSQLであらゆる種類のことを試しましたが、SSIS 2012では同じエラーが発生しません。コンテキストは、多くの動的SQLアプローチの問題です。

これは運で、私が試した最新のものです:

DECLARE @sql VARCHAR(MAX) 
SET @sql = 'SELECT * FROM ' + @dataTableName 

DECLARE @listStr VARCHAR(MAX) 
SELECT @listStr = COALESCE(@listStr +',','') + [name] + ' ' + system_type_name FROM sys.dm_exec_describe_first_result_set(@sql, NULL, 1) 

exec('exec(''SELECT * FROM myDataTable'') WITH RESULT SETS ((' + @listStr + '))') 
+0

あなたが '' '' '' '' '' 'FMTONLY OFFを試した場合、 EXEC MyProc'をOLEDBソースに追加します。それはそれをより良くするか? – billinkc

+0

試しましたが、動作しません。 SSISにはメタデータが必要です。 – jdf35

+0

Bummer。 2008年から2012年に移行した一時テーブルを扱う友人のためのトリックワークを持っていました。 – billinkc

答えて

4

だから私は親切心から聞いて、神の緑の地球上であなたは、このようなダイナミックなソースデータを処理するために、SSISデータフロータスクを使用している理由で?静的なデザインで入力してキャッシュすることができ、既知のメタデータで知られているソースを抽出するために

  • :あなたはSSISデータフロータスクのすべての目的をpervertingしているので、あなたがトラブルに実行している理由がある

    -time

  • は(理想的には非同期と)単純と呼ばれるプロセスを介して実行する
  • が既知のメタデータとも知られている先にその変換されたデータを取得し、それをロードするために変換

異なるデータを戻すパラメータ化されたデータソースを持つことは問題ありません。しかし、毎回まったく異なるメタデータを返すようにするためには、異なるセット間で一致するものはありません。率直に言えば、私は作業中の2008パッケージですべてのカラムメタデータをどのように扱ったかを知りたいとは思っていません。

これは、SSISクエリにWITH RESULTS SETを追加して、メタデータを生成できるようにするためです。これは実行時にこれを行いません - できません!それは既知の列のセットを持っていなければなりません(なぜなら、それらをすべてコンパイルされた変数にエイリアスするためです)。データフロータスクを実行するたびに、同じ列が、名前、型、および制約にまったく同じ列を必要とします。

これは1つの(ひどいひどい)解決策につながります.Column1、Column2 ... ColumnNを持つ一時テーブルにすべてのデータを貼り付け、テーブル名パラメータとして使用しているのと同じ変数を使用して条件分岐しますあなたのコードを作成し、列で何でもしてください。

さらにもう少し単純なソリューションは、ソーステーブルごとにデータフロータスクを作成し、優先度制約でパラメータを使用して、実行するデータフロータスクを選択するだけです。

これは、すぐに利用できるETLに適したソリューションであるため、SSISが提供するデータフロータスクではなく、C#またはスクリプトタスクで独自のロールを検討する必要があります。

要するに、このようにしないでください。子供たち(パッケージ)を考えてみよう!

+0

これは理論上は問題ありませんが、実際には、数百のOLE DBソースをセットアップして2008年に完全に動作するように、2012年にアップグレードする必要がある230個のSSISパッケージがあれば、迅速なソリューションを探しています。 – jdf35

1

私はこれを達成するためにCozyRoc Dynamic DataFlow Plusを使用しました。

構成テーブルを使用してSQL Select文を作成すると、OracleおよびSybase(または任意のOLEDBソース)からMS SQLにデータをロードする単一のSSISパッケージがあります。結果セットの中には何百万行ものものがあり、パフォーマンスは優れています。

新しいテーブルが必要になるたびに新しいパッケージを書き込むのではなく、数分で構成して、事前にテストされた堅牢な既存のパッケージで実行できます。

これがなければ、何百ものパッケージを書いていたでしょう。

関連する問題