簡體   English   中英

使用SQL合並或UPDATE / INSERT

[英]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可能很吸引人,但是我有一些理由回避它:

  1. 語法令人生畏且難以記住...
  2. 除非您有意添加特定的鎖定提示,否則您不會獲得比上述方法更多的並發性
  3. MERGE有許多未解決的錯誤,可能還有更多尚未發現的錯誤...

我最近也在這里發布了一個警告提示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM