web-dev-qa-db-ja.com

SSISパッケージが一時テーブルのメタデータを取得しない

複数のフローを含むSSISパッケージがあります。

各フローは、「ステージング」テーブルの作成を担当します。このテーブルは、作成後に満たされます。これらのテーブルはglobal一時テーブルです。

上記のとおり、別のテーブル用に1つの追加フロー(パッケージを作成しませんでした)を追加しました。ただし、何らかの理由で、このフローではパッケージが断続的に失敗しますが、一部のテーブル名を除き、他のパッケージとまったく同じです。

表示され続けるエラー:

更新-データフローの挿入:エラー:SSISエラーコードDTS_E_OLEDBERROR。 OLE DBエラーが発生しました。エラーコード:0x80004005。OLE DBレコードが利用可能です。ソース: "Microsoft SQL Server Native Client 11.0" Hresult:0x80004005説明:「不明なエラー」。OLE DBレコードが利用可能です。ソース:「Microsoft SQL Server Native Client 11.0」Hresult:0x80004005説明:「ステートメント 'select * 「## TmpMcsConfigurationDeviceHistory86B34BFD041A430E84CCACE78DA336A1」から一時テーブルを使用しています。」.

作成式:

"CREATE TABLE " + @[User::TmpMcsConfigurationDeviceHistory]  + " ([RecId] [bigint] NULL,[DataAreaID] [nvarchar](4) COLLATE database_default NULL,[Asset] [bigint] NULL,[Code] [nvarchar](255) COLLATE database_default NULL,[Configuration] [bigint],[StartdateTime] [datetime] NULL,[EndDateTime] [datetime] NULL)

解析された式(=評価済み):

CREATE TABLE ##TmpMcsConfigurationDeviceHistory764E56F088DC475C9CC747CC82B9E388 ([RecId] [bigint] NULL,[DataAreaID] [nvarchar](4) COLLATE database_default NULL,[Asset] [bigint] NULL,[Code] [nvarchar](255) COLLATE database_default NULL,[Configuration] [bigint],[StartdateTime] [datetime] NULL,[EndDateTime] [datetime] NULL)
25
Mortana

WITH RESULT SETSを使用して明示的にメタデータを定義する を指定すると、SSISはsp_describe_first_result_setステップをスキップして、定義したメタデータを使用できます。利点は、これを使用して、SSISが一時テーブルを含むSQLを実行できるようにすることです(私にとっては、そのパフォーマンスは大いに役立ちました)。欠点は、何か変更があった場合、これを手動で保守および更新する必要があることです。

クエリサンプル(ストアドプロシージャ:)

    EXEC ('dbo.MyStoredProcedure')
    WITH RESULT SETS
      (
        (
            MyIntegerColumn INT NOT NULL,
            MyTextColumn VARCHAR(50) NULL,
            MyOtherColumn BIT NULL
        )
      )

クエリサンプル(単純なSQL :)

EXEC ('
    CREATE TABLE #a 
      (
        Col INT
      ) 
    INSERT INTO #a 
      (
        COL
      )
    SELECT 1 AS Col

    SELECT Col 
    FROM #a')
WITH RESULT SETS ( (Col INT NOT NULL))
  )
36
AHiggins

別のオプション(ハッキングのようなものですが、動作し、グローバル一時テーブルの使用を変更する必要はありません)は、実際のクエリの前にSET FMTONLY ONコマンドを使用して偽の「最初の結果セット」を送信することです正しい列構造を持つSSIS。だからあなたは次のようなことをすることができます

SET FMTONLY ON
select 0 as a, 1 as b, 'test' as C, GETDATE() as D
SET FMTONLY OFF

select a, b, c, d from ##TempTable

SSISがsp_describe_first_result_setを実行すると、FMTONLYコマンドのメタデータと列名が返され、試してさえいないので一時テーブルのメタデータを特定できないことについて文句を言うことはありません。

15
Kyle Hale

SSIS 2012で作業している場合、システムストアドプロシージャsp_describe_first_result_setを使用してテーブルのメタデータをフェッチし、一時テーブルをサポートしません。ただし、テーブル変数やCTEなど、他のオプションは問題なく機能します。 https://connect.Microsoft.com/SQLServer/feedback/details/629077/denali-engine-metadata-discovery-shuns-temp-tables

9
Sonam

ステージングに一時テーブルを使用するのと同じ問題がありました。しばらく過ごした後、回避策を見つけました。

OLE DB/ADO Destination of Data flowタスクでは、ステージングテーブルの名前を指定します。

AccessModeプロパティをOpenRowSetではなくSQLコマンドに変更し、SQLコマンドプロパティを「select * from #temp」に指定します。

万歳、期待通りに動作します。

ここでキャッチするのは、SQLコマンド以外のアクセスモードを指定した場合です。SSISはそれをテーブル/ビューと見なし、SSISを変更してsp_describe_first_result_setを呼び出してメタデータを取得します。ただし、SQLコマンドを指定すると、クエリまたはSPコマンドなどが必要になるため、幸いにもメタデータを取得する古い方法が使用されます。

http://social.msdn.Microsoft.com/Forums/sqlserver/en-US/cfe1c7c1-910a-4f52-9718-c3406263b177/usage-of-temp-tables-in-ssis-2012?forum= sqlintegrationservices#cfe1c7c1-910a-4f52-9718-c3406263b177

0
vonbalaji

問題はGUID重複する問題にあり、一時テーブルを作成するような要素)をコピーし、コピー時にすべて同じGUIDを受け取りました。すべてをリセットするツールを使用しましたパッケージ内のこれらのGUIDにより、問題が解決しました。

ありがとう!

0
Mortana