2017-01-12 1 views
4

ほとんどの人が知っているように、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

+0

グローバルテンポラリテーブルやテーブル変数などのテンポラリテーブル以外の方法で試したことがありますか?ステージング環境で通常のテーブルとして一時テーブルを作成することは可能ですか? – iamdave

+0

私はそれを考えましたが、それは本当にオプションではありません。パフォーマンスを上げるために、いくつかの中間ステップ(一時テーブル)を必要とする(複雑な)ファクトテーブルをロードしようとしています。永続化された一時テーブルを作成することはアーキテクチャには適していません。なぜなら、奇妙なことは、OLE_DBソースに貼り付けるとクエリが機能するからです。生成するときには機能しません。私はそれがBIML検証の問題だと思う。たぶん、エンジンはまだSSIS2008バリデーションなどを使用しています。 2012年現在、結果セットは完璧に動作するはずです –

+0

私はストアドプロシージャにSET FMTONLY OFFを追加しました。結果セットの構文で呼び出されます。 – Doc

答えて

0

私の現在のBimlプロジェクトで同様の問題が発生しました。あなたが言及したように、この問題は、Bimlがストアドプロシージャ内の一時テーブルの生成を考慮していないように思われる。

私の解決策(回避策?)は、一時テーブルではなくグローバルテンポラリテーブルにすることでした。次に、メインのストアドプロシージャと同じコードを実行して、tempテーブルの作成を処理する新しいストアドプロシージャを作成しました。 Bimlで 'Generate Packages'を実行する前に、SSMSで新しいクエリウィンドウを開いて、そのストアドプロシージャを実行し、そのウィンドウを開いたままにします(セッションまたはこのケースのクエリウィンドウが開いている限り、最後にグローバルTempテーブルが開きます)。

これはちょっと苦しいですが、同時にストアドプロシージャの実行時間を35分から5分に短縮しました。「パッケージの生成」ステップではこれについて心配する必要があります。それがそれに値すると言っています。

1

私はこれらの問題に直面しました。私はhereと記載されているソリューションを使用しました。オリジナルの答えはBIMLで生成に関するものではありませんが、私は正常に

2015年には、私は一例として、このストアドプロシージャを使用Visual StudioでBIML Expressでこのソリューションを使用している:

CREATE PROCEDURE csp_MyCsp 
AS 
BEGIN 

    SET NOCOUNT ON; 

    IF 1 = 0 
    BEGIN 
     SELECT CONVERT(INT, NULL) AS [database_id] 
     ,  CONVERT(SYSNAME, NULL) AS [name] 
    END; 

    CREATE TABLE #mydatabases (
     [database_id] INT, 
     [name] SYSNAME 
    ); 

    INSERT INTO #mydatabases 
    SELECT [database_id], [name] 
    FROM sys.databases 

    SELECT [database_id], [name] 
    FROM #mydatabases 

END; 

をそして、これは私のBIMLに含まれていました:

EXEC dbo.csp_MyCsp WITH RESULT SETS (
    (
     [database_id] INT, 
     [database_name] SYSNAME 
    ) 
) 
関連する問題