web-dev-qa-db-ja.com

データフローソースで一時テーブルを使用することはできますか?

2012 SSISパッケージにデータフローがあり、一時テーブルをデータソースとして使用しようとしています。 SQLコマンドデータアクセスモードでOLE DBデータソースを使用しています。

私のコードは次のようになります:

CREATE TABLE #Checksums (DBName sysname, CheckSum bigint)
-- Code that loads the Checksum table here
SELECT DBName, CheckSum FROM #Checksums

データソースに列のリストを取得させるために、一時的に次のように記述します。

SELECT CAST(NULL AS sysname) DBName, CAST(NULL as bigint) CheckSum

これで列が作成され、目的地にマップすることができました。

データフローでValidateExternalMetadataをfalseに設定し、データフローでDelayValidationをtrueに設定しました。

私のコードはSSMSで正しく動作しますが、パッケージを実行するたびに次のエラーが発生します。

[OLE DB Source [39]] Error: SSIS Error Code DTS_E_OLEDBERROR.  An OLE DB error has occurred. Error code: 0x80004005.
An OLE DB record is available.  Source: "Microsoft SQL Server Native Client 11.0"  Hresult: 0x80004005  Description: "Invalid object name '#qtemp'.".
[OLE DB Source [39]] Error: Unable to retrieve column information from the data source. Make sure your target table in the database is available.
[SSIS.Pipeline] Error: OLE DB Source failed the pre-execute phase and returned error code 0xC020204A.

このような一時テーブルをデータソースで使用することはできますか?もしそうなら、私が見逃しているトリックはありますか?

3
Kenneth Fisher

これらのステップは私を助けました:

  1. 最終結果セットをテーブルに書き込みます。
  2. そのテーブルをCREATEとして新しいNew Query Editorウィンドウにスクリプト化します。
  3. 列を定義する開始ブラケットと終了ブラケットを除くすべてを削除します。
  4. それをブラケットの別のペアにラップします。
  5. SPからの呼び出しを再構成します

    exec p_MySPWithTempTables ?, ?
    

exec p_MySPWithTempTables ?, ? with result sets
(
    (
        ColumnA int,
        ColumnB varchar(10),
        ColumnC datetime
    )
)
3
Irawan Soetomo

一時テーブルはSSISを混乱させます。この問題を回避するには、次のようにコードを記述します。

Use Database
Begin
    Exec('Create Table ##Table(Field Integer)') With Result Sets None;
    Exec('Select Field From ##Table') With Result Sets
    ((
        Field Integer
    ));
End

これにより、一時テーブルを使用でき、メタデータをSSISに提供します。

1
Chris

これは古い投稿であることはわかっていますが、SSISだけでなく、Management StudioインポートウィザードやPowerPivotなどでも役立つ別の解決策を提供したいと思いました。一時テーブルにインデックスを付ける必要がない場合は、代わりに常にテーブル変数を使用できます。最初に "set nocount on"ヒントを使用している限り、これをSSISデータフローソースで使用できるはずです。新しいコードは次のようになります...

set nocount on

declare @Checksums table (DBName sysname, CheckSum bigint)
--Code that loads the Checksum table here
select DBName, CheckSum from @Checksums
0
Warren Hasbro