我建議在目標服務器上加載臨時表,然後將結果合併到目標服務器上的目標表中。如果您需要運行任何衛生規則,那麼您可以通過存儲過程執行此操作,因爲您必須獲得比通過SSIS數據流轉換任務更好的性能。此外,重複數據刪除通常是一個多步驟的過程。您可能想要重複數據刪除:
- 不同的行。
- 獨特的列組,如名字,姓氏,電子郵件地址等
- 您可能希望對現有目標表進行重複數據刪除。如果是這樣的話,那麼你可能需要包含NOT EXISTS或NOT IN語句。或者您可能想要使用新值更新原始行。這通常最好用MERGE語句和源代碼的子查詢。
- 採取特定模式的第一行或最後一行。例如,您可能需要爲文件中輸入的每個電子郵件地址或電話號碼輸入最後一行。我通常依靠具有ROW_NUMBER()的CTE來生成連續訂單和反向訂單列,如下面的示例所示:
。
WITH
sample_records
( email_address
, entry_date
, row_identifier
)
AS
(
SELECT '[email protected]'
, '2009-10-08 10:00:00'
, 1
UNION ALL
SELECT '[email protected]'
, '2009-10-08 10:00:01'
, 2
UNION ALL
SELECT '[email protected]'
, '2009-10-08 10:00:02'
, 3
UNION ALL
SELECT '[email protected]'
, '2009-10-08 10:00:00'
, 4
UNION ALL
SELECT '[email protected]'
, '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到最終目的地。
當你說「重複」時,你是指記錄是相同的,還是記錄主鍵相同的記錄? – 2008-09-30 09:47:19