2013-04-14 4 views
0

У меня есть таблица (Customer_Master_File), которая должна обновляться из плоских файлов, сбрасываемых в папку. У меня есть пакет служб SSIS, который работает, чтобы забрать плоские файлы и импортирует их в временную таблицу (temp_Customer_Master_File)Использование SQL Merge или UPDATE/INSERT

То, что я был не в состоянии сделать это:

для каждой записи в таблице темп, если номер_объекта существует в главной таблице, обновляйте его, если не вставлять содержимое таблицы temp.

Я обновляю все поля записи, не ища отдельные изменения полей.

Я попробовал функцию SQL Merge, но это ошибки, когда в исходных данных имеется более одной записи.

Плоские файлы содержат изменения в записи клиента, и одновременно может быть более одного изменения. Я просто хочу обрабатывать каждую запись с вставкой или обновлением по мере необходимости.

Я также пробовал делать INSERT INTO MASTER_FILE FROM TEMP_TABLE ГДЕ CUSTOMER_NUMBER НЕ В MASTER_FILE, но это также терпит неудачу с ошибкой PK при попадании в дублирующую строку источника.

ответ

3
UPDATE m SET 
    col2 = t.col2, 
    col3 = t.col3 -- etc. - all columns except Customer_Number 
FROM dbo.Master_File AS m 
INNER JOIN 
(
    SELECT 
    Customer_Number, rn = ROW_NUMBER() OVER 
    (
     PARTITION BY Customer_Number ORDER BY [timestamp_column] DESC 
    ), col2, col3, ... etc ... 
    FROM dbo.Temp_Table 
) AS t 
ON m.Customer_Number = t.Customer_Number 
WHERE t.rn = 1; 

INSERT dbo.Master_File(Customer_Number, col2, col3, ...etc...) 
    SELECT Customer_Number, col2, col3, ...etc... 
    FROM 
    (
    SELECT 
     Customer_Number, rn = ROW_NUMBER() OVER 
     (
     PARTITION BY Customer_Number ORDER BY [timestamp_column DESC 
    ), 
     col2, col3, ...etc... 
    FROM dbo.Temp_Table AS t 
    WHERE NOT EXISTS 
    (
     SELECT 1 FROM dbo.Master_File AS m 
     WHERE m.Customer_Number = t.Customer_Number 
    ) 
) AS x WHERE rn = 1; 

Это касается нескольких строк в исходной таблице, которые еще не существуют в пункте назначения. Я сделал предположение о именах столбцов, которые вам придется настроить.

MERGE может быть заманчивым, однако есть несколько причин, почему я уклоняться от него:

  1. синтаксис сложной и трудно запомнить ...
  2. you don't get any more concurrency than the above approach unless you intentionally add specific locking hints ...
  3. there are many unresolved bugs with MERGE и вероятно, еще многое, что еще предстоит выяснить ...

I recently published a cautionary tip here as well.

+0

Благодарим за это, обновления отлично работают, вставки не работают из-за повторяющихся строк. На самом деле не имеет значения, какую запись я использую для вставок, в temp_table есть столбец timestamp, поэтому самая последняя запись будет работать. – Kerberos42

+0

Спасибо за обновление с помощью столбца timestamp, я его не пробовал, но похоже, что он сработает. Еще раз спасибо! – Kerberos42

Смежные вопросы