33

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

各フローは、作成後にいっぱいになる「ステージング」テーブルの作成を担当します。これらのテーブルはグローバル一時テーブルです。

別のテーブルに、上記とまったく同じように 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 * from '##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)
4

6 に答える 6

52

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

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

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

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

EXEC ('
    CREATE TABLE #a 
      (
        MyIntegerColumn INT NOT NULL,
        MyTextColumn VARCHAR(50) NULL,
        MyOtherColumn BIT NULL
      ) 
    INSERT INTO #a 
      (
        MyIntegerColumn,
        MyTextColumn,
        MyOtherColumn
      )
    SELECT 
        1 AS MyIntegerColumn,
        ''x'' AS MyTextColumn,
        0 AS MyOtherColumn

    SELECT MyIntegerColumn, MyTextColumn, MyOtherColumn
    FROM #a')

WITH RESULT SETS
    (
        (
            MyIntegerColumn INT NOT NULL
           ,MyTextColumn VARCHAR(50) NULL
           ,MyOtherColumn BIT NULL
        )
    )
于 2015-02-04T18:29:56.803 に答える
16

別のオプション (一種のハックですが、機能し、グローバル一時テーブルの使用を変更する必要はありません) は、実際のクエリの前に 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 コマンドのメタデータと列名が返されます。また、一時テーブルのメタデータを特定できなくてもエラーになることはありません。

于 2013-08-21T14:31:33.843 に答える
1

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

OLE DB/ADO のデータ フロー タスクの宛先で、ステージング テーブルの名前を指定します。

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

万歳、期待どおりに機能しています。

SQL コマンド以外のアクセス モードを指定すると、SSIS はそれがテーブル/ビューであると想定し、メタ データを取得するために sp_describe_first_result_set を呼び出すように SSIS を変更しました。ただし、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

于 2014-04-01T14:24:47.963 に答える