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.
このような一時テーブルをデータソースで使用することはできますか?もしそうなら、私が見逃しているトリックはありますか?
これらのステップは私を助けました:
SPからの呼び出しを再構成します
exec p_MySPWithTempTables ?, ?
に
exec p_MySPWithTempTables ?, ? with result sets
(
(
ColumnA int,
ColumnB varchar(10),
ColumnC datetime
)
)
一時テーブルは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に提供します。
これは古い投稿であることはわかっていますが、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