2016-07-08 74 views
1

我有數據庫表的100,000行,每週從CSV導入使用SSIS包。 通常更新,但有時它可以添加行。SSIS改進upsert方法

我在更新行中看到staging表的一些例外 - 我不知道爲什麼?以及如何從分段更新到目標表?

這是合併代碼:

MERGE INTO [PWCGFA_BG].[dbo].[Bank_Guarantees] WITH (HOLDLOCK) AS bg 
USING [PWCGFA_BG].[dbo].[stagingBG] AS stgbg 
    ON bg.IATA_CODE = stgbg.IATA_CODE 
WHEN MATCHED THEN 
    UPDATE set 
     bg.LEGAL_NAME=stgbg.LEGAL_NAME, 
    bg.TRADING_NAME=stgbg.TRADING_NAME, 
    bg.COUNTRY=stgbg.COUNTRY, 
    bg.CURRENCY=stgbg.CURRENCY, 
    bg.LANGUAGE=stgbg.LANGUAGE, 
    bg.STATUS=stgbg.STATUS, 
    bg.BANK_NAME=stgbg.BANK_NAME, 
    bg.BANK_GUARANTEE_AMOUNT=stgbg.BANK_GUARANTEE_AMOUNT, 
    bg.BANK_GUARANTEE_CURRENCY=stgbg.BANK_GUARANTEE_CURRENCY, 
    bg.BANK_GUARANTEE_EXPIRY_DATE=stgbg.BANK_GUARANTEE_EXPIRY_DATE, 
    bg.ACCREDITATION_DATE=stgbg.ACCREDITATION_DATE, 
    bg.CLASS_PAX_OR_CGO=stgbg.CLASS_PAX_OR_CGO, 
    bg.LOCATION_TYPE=stgbg.LOCATION_TYPE, 
    bg.XREF=stgbg.XREF, 
    bg.IRRS=stgbg.IRRS, 
    bg.TAX_CODE=stgbg.TAX_CODE, 
    bg.COUNTRY_CODE=stgbg.COUNTRY_CODE, 
    bg.CITY=stgbg.CITY, 
    bg.DEF=stgbg.DEF, 
    bg.OWN_SHARE_CHANGE=stgbg.OWN_SHARE_CHANGE 
WHEN NOT MATCHED BY bg THEN 
    INSERT (IATA_CODE,LEGAL_NAME,TRADING_NAME,COUNTRY,CURRENCY,LANGUAGE,STATUS,BANK_NAME,BANK_GUARANTEE_AMOUNT,BANK_GUARANTEE_CURRENCY,BANK_GUARANTEE_EXPIRY_DATE,ACCREDITATION_DATE,CLASS_PAX_OR_CGO,LOCATION_TYPE,XREF,IRRS,TAX_CODE,CITY,DEF,OWN_SHARE_CHANGE) 
    VALUES (stgbg.IATA_CODE,stgbg.LEGAL_NAME,stgbg.TRADING_NAME,stgbg.COUNTRY,stgbg.CURRENCY,stgbg.LANGUAGE,stgbg.STATUS,stgbg.BANK_NAME,stgbg.BANK_GUARANTEE_AMOUNT,stgbg.BANK_GUARANTEE_CURRENCY,stgbg.BANK_GUARANTEE_EXPIRY_DATE,stgbg.ACCREDITATION_DATE,stgbg.CLASS_PAX_OR_CGO,stgbg.LOCATION_TYPE,stgbg.XREF,stgbg.IRRS,stgbg.TAX_CODE,stgbg.CITY,stgbg.DEF,stgbg.OWN_SHARE_CHANGE) 
WHEN NOT MATCHED BY stgbg THEN 
    DELETE 

enter image description here

+0

什麼是「幾EXP」?例外?你需要告訴我們什麼例外與一些源數據一起。 – BIDeveloper

+0

幾個例子,我的意思是說,對於更新,他們使用登臺表,但我不知道他們是如何從分段到目標數據庫插入的,在我的情況下,我在ssms中爲更新創建了一個存儲過程,並在OLE DB中執行它命令 – BKChedlia

+0

也許你應該改變你的sp從暫存表到'Bank_Guarantees'做一個'MERGE'而不是'UPDATE'。在這種情況下,您可以擺脫'Lookup'和'Bank_Guarantees Destination' – vercelli

回答

1

如果源(分期)和目標表在同一臺服務器上,你可以使用MERGE語句執行SQL任務,這是更快,非常比使用逐行操作的查找更有效。

但如果目標是不同的服務器上,您有以下選項

  1. Use lookup to update the matching rows with an OLEDB Command(UPDATE Statement)
  2. Use a Merge Join (with LEFT OUTER JOIN) to identify the new/matching records and then use a conditional split to INSERT or UPDATE records. This works same as the Lookup but faster.
  3. Create a temporary table in the destination db, dump data from staging to that table and then use the MERGE statement, this is faster than using a lookup.
+0

我試過這種合併(上面,我編輯我的帖子),但我有這個錯誤消息:[執行SQL任務]錯誤:執行查詢「MERGE INTO [PWCGFA_BG]。[dbo]。[Bank_Guar ...」failed with以下錯誤:「bg'附近的語法不正確。」可能的失敗原因:查詢問題,「ResultSet」屬性設置不正確,參數設置不正確或連接未正確建立。 – BKChedlia

+1

更改您的語句從何時不匹配由bg然後到何時不匹配由目標然後當不匹配時由stgbg然後匹配不匹配時您需要使用關鍵字TARGET和SOURCE而不是別名希望這有助於 –

+0

謝謝,我做了,當我刪除行然後添加新行並編輯行,我有另一個問題:MERGE語句試圖更新或刪除同一行不止一次。當目標行匹配多個源行時會發生這種情況。 MERGE語句不能多次更新/刪除目標表的同一行。細化ON子句以確保目標行至多與一個源行匹配,或使用GROUP BY子句對源行進行分組。 – BKChedlia