2016-08-30 38 views
0

目前我有一個使用Cursor的大存儲過程,裏面有兩個合併語句。簡而言之,我想從一張大桌子填充2張桌子。子查詢返回了多個值。使用merge和tsql

現在,我對sql很陌生,並且閱讀了一些內容以擴展我的知識。在這項研究中,我遇到了很多討論遊標和他們可能給出的性能問題的主題。

當前的SP(使用光標)工作正常,但我堅持嘗試使用我的代碼而不使用遊標(其他POV),它會讓我感到困惑。

所以現在我被這個小小的垃圾代碼卡住了。我認爲不可能以我想要的方式去做,但是我可以嘗試。

錯誤:子查詢返回多個值。這當子查詢跟隨不允許=,=,<,...

代碼:

MERGE CONTACTS as target 
USING STAGING_CONTACTS as source 
ON (target.ID = source.ID) 
WHEN MATCHED THEN 
    UPDATE SET 
     MAIL = (SELECT MAIL FROM STAGING_CONTACTS), 
     NAME = (SELECT NAME FROM STAGING_CONTACTS), 
     BRAND = (SELECT BRAND FROM STAGING_CONTACTS), 
     ID = (SELECT ID FROM STAGING_CONTACTS) 
WHEN NOT MATCHED THEN 
    INSERT (MAIL, NAME, BRAND, CORESOLEIL_ID) 
    VALUES ((SELECT MAIL FROM STAGING_CONTACTS), 
     (SELECT NAME FROM STAGING_CONTACTS), 
     (SELECT BRAND FROM STAGING_CONTACTS), 
     (SELECT ID FROM STAGING_CONTACTS)); 

這是兩個合併報表我有一個,這是一個更小。

歡迎任何反饋!

感謝提前:)

+1

合併是一個有缺陷的實現,是非常困難的調試後,當有潛在的數據問題。我永遠不會允許任何人在我們的生產數據庫中使用它。更好地使用更新語句後跟一個插入(順序很重要) – HLGEM

+1

https://www.mssqltips.com/sqlservertip/3074/use-caution-with-sql-servers-merge-statement/ –

回答

2

刪除選擇statements..Below聲明照顧其表的使用該表進行更新。

MERGE CONTACTS as target 
USING STAGING_CONTACTS as source 

所以你的查詢可以像下面

UPDATE SET 
     MAIL = MAIL , 
     and so on... 
WHEN NOT MATCHED THEN 
    INSERT (MAIL, NAME, BRAND, CORESOLEIL_ID) 
    VALUES (mail,name,brand,id) 

你也可以像別名一樣

MERGE CONTACTS as target 
USING STAGING_CONTACTS as source 
ON (target.ID = source.ID) 
WHEN MATCHED THEN 
    UPDATE SET 
     target.MAIL = source.MAIL, 
     and so on.. 
WHEN NOT MATCHED THEN 
    INSERT (MAIL, NAME, BRAND, CORESOLEIL_ID) 
    VALUES (source.all columns....) 
+0

這工作完美我,謝謝你! –

0

使用下面的腳本..

MERGE CONTACTS as target 
USING STAGING_CONTACTS as source 
ON (target.ID = source.ID) 
WHEN MATCHED THEN 
    UPDATE SET 
     target.MAIL = source.MAIL , 
     target.NAME = source.Name, 
     target.BRAND = source.BRAND , 
     target.ID = source.ID 
WHEN NOT MATCHED THEN 
    INSERT (MAIL, NAME, BRAND, CORESOLEIL_ID) 
    VALUES (source.MAIL , source.Name, source.BRAND ,source.ID);