テーブル/ビューからパーティション ビューにデータを挿入するために、OLE DB コマンドまたは oledb 宛先 (データ アクセス モード - sql コマンド) でクエリを記述する方法。
1 に答える
分割ビューは、この質問の前に私が経験したことがなかったものです。リンクされた記事で提供されている定義を使用して、このスキーマとサンプルの挿入を思いつき、自分がやっていることがわかっていることを確認しました。
トランザクションをロールバックしたため、dbo.Year1998Sales
ビューにデータがありませんでした。次に、新しい SSIS パッケージを作成しました。SQL Server 2012 に SSIS を使用したという事実は、結果には関係なく、構成は同じです。
新しいパッケージを作成し、データ フローを追加し、OLE DB 接続マネージャーを追加し、データ フロー内に OLE DB ソースを OLE DB 宛先に接続しました。
私のソースでは、SQLFiddle デモと同じクエリを使用しました
SELECT
D.number AS OrderId
, D.number * 100 AS CustomerID
, DATEADD(D, d.number % 365, '1998-01-01') AS OrderDate
, 1+ (D.number % 12) AS OrderMonth
, DATEADD(mm, (D.number % 12), '1998-01-01') AS DeliveryDate
FROM
(
SELECT
ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) -1 AS some_number
FROM
master.dbo.spt_values AS SV
) D (number)
ORDER BY D.number ASC;
私dbo.Year1998Sales
は宛先とビオラとして選択しました、それは動作します。実際、いいえ、それは私の驚きではありませんでした。SSMS 内で機能したものは、データ フローでエラーになります。
[OLE DB Destination 2 ] エラー: SSIS エラー コード DTS_E_OLEDBERROR。OLE DB エラーが発生しました。エラー コード: 0x80004005。OLE DB レコードが利用可能です。ソース: "Microsoft SQL Server Native Client 11.0" Hresult: 0x80004005 説明: "パーティション ビュー 'FOO.dbo.Year1998Sales' は、一括操作のターゲットとして更新できません。".
解像度
このエラー メッセージのわかりやすい部分は、「一括操作の対象」です。Table or view - fast load
またはのデータ アクセス モードではTable name or view name variable - fast load
、テーブルへの一括挿入が行われます。一般的に言えば、これは必要なことです。ただし、この場合、それは不可能であるため、宛先Table or view
またはTable name or view name variable
.
それは機能し、小さなデータセットの場合、それが私のアプローチになります。
代替案 1
ビューの論理構造を完全にバイパスし、条件付き分割を使用してロジックを再作成し、N 個のテーブルに書き込みます。これにより、テーブルに対して一括更新を使用できるようになります。ただし、そのビジネス ロジックをパッケージにレプリケートし、2 つの同期を維持するためにパッケージをさらにメンテナンスするには、少なからぬコストがかかります。基になるビューでロジックが変更され、それらの変更がパッケージに反映されないか、正しく移植されない場合は、天国が役立ちます。絶対的なビジネス上の理由がない限り、私はこの道をたどりません。
代替案 2
データをステージングします。分割ビューに書き込む代わりに、すべてのデータをデータ フローのステージング テーブルに書き込みます。データ フローの直後に、ステージング テーブルからビューにデータをプッシュする SQL 実行タスクを用意します。
確かなことはわかりませんが、これは代替案 1 または元の解像度よりも優れたパフォーマンスを発揮すると想定していますが、テストは行っていません。また、私が働いている場所など、いくつかの場所では、新しいテーブルを作成することがかなり物議を醸す可能性があることを知っているため、これを主要な解決策としてリストしません。