2015-10-23 78 views
0

我是SQL新手,我想用來自臨時小數據庫的數據更新「大」數據庫。SQL合併更新特定屬性

CREATE PROCEDURE sp_update_DimSomeone 
AS 
BEGIN 
MERGE DimSomeone AS V 
USING DimSomeone_temp AS T 
    ON V.AltKey = T.Altkey 
WHEN NOT MATCHED BY TARGET AND T.AltKey <> '' THEN 
    INSERT VALUES (AltKey, Param1, Param2, Param3) 
WHEN MATCHED AND T.Param1 <> V.Param1 THEN 
    UPDATE SET V.Param1 = T.Param1 
WHEN MATCHED AND T.Param2 <> V.Param2 THEN 
    UPDATE SET V.Param2 = T.Param2 
WHEN MATCHED AND T.Param3 <> V.Param3 THEN 
    UPDATE SET V.Param3 = T.Param3 

END 

我已經得到了錯誤:類型的行動「WHEN MATCHED」不能出現不止一次在MERGE語句的「更新」的條款。

我明白這個消息,但我不想更新整行,只有屬性,這是不一樣的。 (例如,帶有AltKey 001的客戶在temp中更改您的地址,我想只更新Param3(例如地址),而不是整行)。

感謝您的回答!

回答

1

爲什麼不總是更新param1,param2和param3?結果將是一樣的!

CREATE PROCEDURE sp_update_DimSomeone 
AS 
BEGIN 
MERGE DimSomeone AS V 
USING DimSomeone_temp AS T 
    ON V.AltKey = T.Altkey 
WHEN NOT MATCHED BY TARGET AND T.AltKey <> '' THEN 
    INSERT VALUES (AltKey, Param1, Param2, Param3) 
WHEN MATCHED THEN 
    UPDATE SET V.Param1 = T.Param1, 
       V.Param2 = T.Param2, 
       V.Param3 = T.Param3 
END 

編輯: 你至少可以檢查,如果有這3列已經改變,所以你會跳過完全一致行:

CREATE PROCEDURE sp_update_DimSomeone 
AS 
BEGIN 
MERGE DimSomeone AS V 
USING DimSomeone_temp AS T 
    ON V.AltKey = T.Altkey 
WHEN NOT MATCHED BY TARGET AND T.AltKey <> '' THEN 
    INSERT VALUES (AltKey, Param1, Param2, Param3) 
WHEN MATCHED AND (T.Param1 <> V.Param1 OR T.Param2 <> V.Param2 OR T.Param3 <> V.Param3) THEN 
    UPDATE SET V.Param1 = T.Param1, 
       V.Param2 = T.Param2, 
       V.Param3 = T.Param3 
END 
+0

我有10個參數,這個解決方案不是時間太長? – rbranson005

+0

如果性能是一個問題,那麼你首先應該考慮兩件事情:1.表中是否有所有必要的索引/是否有任何損害性能的索引2.如果您拆分合並語句,可能會更快進入經典更新語句,然後是經典插入語句 – CeOnSql

+1

感謝您的建議! – rbranson005