ほとんどの人が知っているように、SSISは一時テーブルを持つストアドプロシージャがOleDbSourceとして使用されるときにメタデータを読みにくいです。以前は、SET FMTONLY OFFを追加することでこれを簡単に防ぐことができました。 EXECステートメントの前に。これの欠点は、ストアドプロシージャが検証中に実行されることです。これはしばらく時間がかかることがあります。 SQL 2012の時点で、WITH RESULT SETSを使用して列とそのデータ型を指定できます。 SSISはこれを拾い上げるだろうし、すべてがSQLの土地にある。一時テーブルを含むストアドプロシージャを使用するBIISを使用したSSISパッケージの生成
しかし、このようなストアドプロシージャをソースとして使用するBIMLを使用してパッケージを生成したいが、そのパッケージを動作させることができない。私は 'dbo.csp_MyCsp'という1つの列 'ColA int'を持つ '#MyTempTable'という一時テーブルを使用するプロシージャを格納しているとします。
<OleDbSource ConnectionName="MyConnection" Name="OLE_SRC Test">
<DirectInput>
EXEC dbo.csp_MyCsp
WITH RESULT SETS
(
([Col1] int)
)
</DirectInput>
</OleDbSource>
私は「無効なオブジェクト#MyTempTable」というエラーが出ます:私は、次の(似た)BIMLコードとOleDbSourceを生成しようとしています。奇妙なことは、パッケージを開いてOleDbSourceのコードに貼り付けると、エラーなく動作します。私は、SSISとBIMLの検証手順が異なると感じています。
皆さんには、適切な解決策がありますか? FMTONLY OFFは使用できません。ストアドプロシージャにはロードに時間がかかるため、生成タイムアウトが発生します。私はSQL Server/SSIS 2014を使用しています。
ありがとうございます!
Marvin
グローバルテンポラリテーブルやテーブル変数などのテンポラリテーブル以外の方法で試したことがありますか?ステージング環境で通常のテーブルとして一時テーブルを作成することは可能ですか? – iamdave
私はそれを考えましたが、それは本当にオプションではありません。パフォーマンスを上げるために、いくつかの中間ステップ(一時テーブル)を必要とする(複雑な)ファクトテーブルをロードしようとしています。永続化された一時テーブルを作成することはアーキテクチャには適していません。なぜなら、奇妙なことは、OLE_DBソースに貼り付けるとクエリが機能するからです。生成するときには機能しません。私はそれがBIML検証の問題だと思う。たぶん、エンジンはまだSSIS2008バリデーションなどを使用しています。 2012年現在、結果セットは完璧に動作するはずです –
私はストアドプロシージャにSET FMTONLY OFFを追加しました。結果セットの構文で呼び出されます。 – Doc