Я бы рекомендовал загрузить промежуточную таблицу на конечном сервере, а затем объединить результаты в целевую таблицу на конечном сервере. Если вам необходимо выполнить какие-либо правила гигиены, вы можете сделать это с помощью хранимой процедуры, поскольку вы обязаны получить лучшую производительность, чем с помощью задач преобразования потока данных служб 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;
Существует множество вариантов для дедупликации файлов, но в конечном итоге я рекомендую обрабатывать это в хранимой процедуре после загрузки промежуточной таблицы на конечном сервере. После очистки данных вы можете либо MERGE, либо ВСТАВИТЬ в свой конечный пункт назначения.