我建议在目标服务器上加载一个暂存表,然后将结果合并到目标表中。如果您需要运行任何卫生规则,则可以通过存储过程来完成,因为这样做的性能比通过SSIS数据流转换任务要好。此外,去重通常是一个多步骤的过程。您可能想要进行以下去重操作:
- 不同的行。
- 像名字、姓氏、电子邮件地址等不同列组的不同组。
- 您可能想要针对现有的目标表进行去重。如果是这种情况,则可能需要包括NOT EXISTS或NOT IN语句。或者您可能想要使用MERGE语句和源的子查询来更新原始行的新值。这通常最好使用CTE和ROW_NUMBER()生成顺序和反向顺序列,如下面的示例所示:
.
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;
在去重文件方面,有很多选项可供选择,但最终我建议在目标服务器上加载暂存表后,在存储过程中处理此问题。在清理数据之后,您可以将其合并或插入到最终目的地。