-1

このスクリプトを使用してテーブルを作成しました。

use DWResourceTask
go
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[DimEntity]') AND type in (N'U'))
DROP TABLE [DimEntity]
Go
Create Table DimEntity

(EntityKey int NOT NULL identity PRIMARY KEY,
[EntCode] [nvarchar](8) NOT NULL,
    [Name] [nvarchar](80) NOT NULL,
    [CompanyRegistration] [nvarchar](80) NULL,
    [Active] [int] NOT NULL,
    [AccessLevel] [int] NOT NULL ,
    [SiteURN] [nvarchar](128) NOT NULL,
    [CompanyURN] [nvarchar](128) NOT NULL,
    [SiteName] [nvarchar](30) NOT NULL,
    [SiteDesc] [nvarchar](60) NULL,
    [SiteURL] [nvarchar](512) NOT NULL)

そして、これを使用してデータを挿入しました

Select e.EntCode, e.Name, e.Active, e.AccessLevel, ss.SiteURN, ss.CompanyURN,
ss.SiteName, ss.SiteDesc, ss.SiteURL
from USA.dbo.SCSite ss, USA.dbo.SCLegalEnt e
where ss.localsiteflag = 1
and e.active = 1
UNION ALL
Select e.EntCode, e.Name, e.Active, e.AccessLevel, ss.SiteURN, ss.CompanyURN,
ss.SiteName, ss.SiteDesc, ss.SiteURL
from UK.dbo.SCSite ss, UK.dbo.SCLegalEnt e
where ss.localsiteflag = 1
and e.active = 1

私がやりたいことは、何回実行しても、新しいレコードを挿入するか、既存のレコードを更新するだけの SSIS パッケージを作成することです。プロセスは反復可能でなければなりません。

「のみ」の新しいレコードを挿入したり、既存のレコードを更新したりするには、OLE DB ソースの SQL コマンドにどのスクリプトを入れる必要がありますか。

ある種の更新コマンドですか?しかし、どのように?テーブル内のデータを更新するために切り捨てまたは削除コマンドが必要だとは思いません。

4

1 に答える 1

3

OLE DB ソース コマンドは、レコードの候補プールを識別するクエリである必要があります。無効であることがわかっているために範囲を除外できる場合は、ここでフィルターを適用します。たとえば、現在の年のデータのみをロードしてから、次のようなフィルターを適用するSELECT T.* FROM Country.dbo.Table AS T WHERE T.year = 2013か、過去 30 日間またはソース範囲が何であれロードします。

これにより、行がデータ フローに流れ込みます。そこから、参照/宛先セットへの利用可能な行で変更検出を実行する必要があります。変更された行を考慮する必要があるため、変更されたものと一致基準に使用されるものを判断するための基準が必要になる可能性があります。私たちのデータ ウェアハウスには、履歴と変更の 2 つのハッシュ キーがあります。履歴は、HASHBYTES 関数を介して一緒にハッシュされたビジネス キーであり、変更キーは、一緒にハッシュされた非ビジネス キーです。最初のルックアップでは、現在の行の履歴ハッシュと参照セットの変更キーの存在をテストします。両方が一致する場合、現在の行がデータセットに存在し、値が同じであるため、行カウントにルーティングされてからビット バケットにルーティングされます。

最初のルックアップからの一致しない出力では、これが新しい行であるか、既存の行への変更であることがわかります。どちらが正しいかを判断するために 2 回目のルックアップを実行する必要があるため、別のルックアップ コンポーネントを追加します。今回は、過去のハッシュ キーでのみ一致します。一致するものが見つかった場合は、更新を実行する必要があります。それ以外の場合は、新しい行があります。

データセットが小さい場合を除き、OLE DB コマンドを使用して更新を実行するのではなく、更新をテーブルにステージングし、データ フローの完了後に SQL 実行タスクを実行して実際に更新を実行すると、パフォーマンスが向上する可能性があります。この理由は、OLE DB コマンド (OLE DB Destination と混同しないでください) が、適切な ETL のセットベースの性質に反するシングルトン データベース操作を実行するためです。

Andy Leonard は、優れたシリーズであるStairway to Integration Services を持っており、増分ロード パターンについて詳しく説明しています。

于 2013-10-29T03:53:06.960 に答える