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