我建议在目标服务器上加载一个临时表,然后将结果合并到目标服务器上的目标表中。如果您需要运行任何卫生规则,那么您可以通过存储过程来执行此操作,因为您一定会获得比通过 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 到最终目的地。