複数のフローを含む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)
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))
)
別のオプション(ハッキングのようなものですが、動作し、グローバル一時テーブルの使用を変更する必要はありません)は、実際のクエリの前に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コマンドのメタデータと列名が返され、試してさえいないので一時テーブルのメタデータを特定できないことについて文句を言うことはありません。
SSIS 2012で作業している場合、システムストアドプロシージャsp_describe_first_result_setを使用してテーブルのメタデータをフェッチし、一時テーブルをサポートしません。ただし、テーブル変数やCTEなど、他のオプションは問題なく機能します。 https://connect.Microsoft.com/SQLServer/feedback/details/629077/denali-engine-metadata-discovery-shuns-temp-tables
ステージングに一時テーブルを使用するのと同じ問題がありました。しばらく過ごした後、回避策を見つけました。
OLE DB/ADO Destination of Data flowタスクでは、ステージングテーブルの名前を指定します。
AccessModeプロパティをOpenRowSetではなくSQLコマンドに変更し、SQLコマンドプロパティを「select * from #temp」に指定します。
万歳、期待通りに動作します。
ここでキャッチするのは、SQLコマンド以外のアクセスモードを指定した場合です。SSISはそれをテーブル/ビューと見なし、SSISを変更してsp_describe_first_result_setを呼び出してメタデータを取得します。ただし、SQLコマンドを指定すると、クエリまたはSPコマンドなどが必要になるため、幸いにもメタデータを取得する古い方法が使用されます。
問題はGUID重複する問題にあり、一時テーブルを作成するような要素)をコピーし、コピー時にすべて同じGUIDを受け取りました。すべてをリセットするツールを使用しましたパッケージ内のこれらのGUIDにより、問題が解決しました。
ありがとう!