宛先サーバーにステージング テーブルをロードし、その結果を宛先サーバーのターゲット テーブルにマージすることをお勧めします。衛生規則を実行する必要がある場合は、SSIS データ フロー変換タスクよりも優れたパフォーマンスを得ることができるため、ストアド プロシージャを使用して実行できます。さらに、重複排除は通常、複数のステップからなるプロセスです。次のものを重複排除することができます。
- 明確な線。
- 名、姓、電子メール アドレスなどの個別の列のグループ。
- 既存のターゲット テーブルに対して重複除外することが必要な場合があります。その場合は、NOT EXISTS または NOT IN ステートメントを含める必要があるかもしれません。または、元の行を新しい値で更新したい場合があります。これは通常、ソースの MERGE ステートメントとサブクエリを使用するのが最適です。
- 特定のパターンの最初または最後の行を取ります。たとえば、電子メール アドレスまたは電話番号が出現するたびに、ファイルに入力された最後の行が必要な場合があります。私は通常、ROW_NUMBER() を使用した CTE に依存して、次のサンプルのように順次および逆順の列を生成します。
.
WITH
sample_records
( email_address
, entry_date
, row_identifier
)
AS
(
SELECT 'tester@test.com'
, '2009-10-08 10:00:00'
, 1
UNION ALL
SELECT 'tester@test.com'
, '2009-10-08 10:00:01'
, 2
UNION ALL
SELECT 'tester@test.com'
, '2009-10-08 10:00:02'
, 3
UNION ALL
SELECT 'the_other_test@test.com'
, '2009-10-08 10:00:00'
, 4
UNION ALL
SELECT 'the_other_test@test.com'
, '2009-10-08 10:00:00'
, 5
)
, filter_records
( email_address
, entry_date
, row_identifier
, sequential_order
, reverse_order
)
AS
(
SELECT email_address
, entry_date
, row_identifier
, 'sequential_order' = ROW_NUMBER() OVER (
PARTITION BY email_address
ORDER BY row_identifier ASC)
, 'reverse_order' = ROW_NUMBER() OVER (
PARTITION BY email_address
ORDER BY row_identifier DESC)
FROM sample_records
)
SELECT email_address
, entry_date
, row_identifier
FROM filter_records
WHERE reverse_order = 1
ORDER BY email_address;
ファイルの重複排除には多くのオプションがありますが、最終的には、宛先サーバーにステージング テーブルをロードしたら、ストアド プロシージャでこれを処理することをお勧めします。データをクレンジングした後、最終的な宛先に MERGE または INSERT を実行できます。