[英]Using SQL Merge or UPDATE / INSERT
我有一個表(Customer_Master_File),需要從轉儲到文件夾的平面文件中進行更新。 我有一個SSIS包,可以運行以拾取平面文件並將其導入到臨時表(temp_Customer_Master_File)
我一直無法做到的是:
對於臨時表中的每個記錄,如果在主表中存在Customer_Number,則對其進行更新(如果未插入臨時表的內容)。
我正在更新記錄的所有字段,而不是查找單個字段更改。
我嘗試了SQL Merge函數,但是當源數據中有多個記錄時,它將出錯。
平面文件包含對客戶記錄的更改,一次可能有多個更改。 我只想根據需要使用插入或更新來處理每個記錄。
我還嘗試從TEMP_TABLE的CUSTOMER_NUMBER NOT IN MASTER_FILE的INSERT INTO MASTER_FILE中執行插入操作,但這在遇到重復的源行時也會失敗,並出現PK錯誤。
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
可能很吸引人,但是我有一些理由回避它:
MERGE
有許多未解決的錯誤,可能還有更多尚未發現的錯誤...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.