2012-08-09 14 views
1

我在這裏讀的MSDN網站: http://technet.microsoft.com/en-us/library/bb510625.aspxMERGE也可以刪除嗎?例如只顯示INSERT/UPDATE

和我有點困惑的一兩件事。

來自該網站的示例(複製在底部)使用行WHEN NOT MATCHED BY TARGET。我的問題是,我可以用它來插入,更新和刪除所有在同一個合併?例如:

--Lazy syntax, but I think you get the idea. 
MERGE x AS TARGET USING (ID, [More Fields...]) AS SOURCE 
WHEN MATCHED 
    update 
WHEN NOT MATCHED IN TARGET 
    insert 
WHEN NOT MATCHED IN SOURCE 
    delete 

MSDN例子:

USE AdventureWorks2012; 
GO 
-- Create a temporary table variable to hold the output actions. 
DECLARE @SummaryOfChanges TABLE(Change VARCHAR(20)); 

MERGE INTO Sales.SalesReason AS Target 
USING (VALUES ('Recommendation','Other'), ('Review', 'Marketing'), 
       ('Internet', 'Promotion')) 
     AS Source (NewName, NewReasonType) 
ON Target.Name = Source.NewName 
WHEN MATCHED THEN 
    UPDATE SET ReasonType = Source.NewReasonType 
WHEN NOT MATCHED BY TARGET THEN 
    INSERT (Name, ReasonType) VALUES (NewName, NewReasonType) 
OUTPUT $action INTO @SummaryOfChanges; 

-- Query the results of the table variable. 
SELECT Change, COUNT(*) AS CountPerChange 
FROM @SummaryOfChanges 
GROUP BY Change; 
+0

在這一點上,你可能只是更換表? – BoeroBoy 2012-08-09 15:22:02

+3

是的,你可以。 @BoeroBoy - 替換桌子可能會過度。例如同步99%的行匹配的兩個表。 – 2012-08-09 15:23:20

+0

也許一些更好的例子在這裏:http://technet.microsoft.com/en-us/library/bb522522(v=sql.100).aspx – 2012-08-09 15:24:46

回答

3

如果你做表的批發掉,然後一個辦法是創建兩個附加模式:

CREATE SCHEMA shadow AUTHORIZATION dbo; 
CREATE SCHEMA cache AUTHORIZATION dbo; 

現在在cache架構中創建表的副本:

CREATE TABLE cache.SalesReason(Name ...); 

現在,當你在做你的開關操作:

TRUNCATE TABLE cache.SalesReason; 
INSERT cache.SalesReason(Name ...) SELECT ... FROM source; 

-- this is a metadata operation so extremely fast - it will wait 
-- for existing locks to be released, but won't block new locks 
-- for very long at all: 

BEGIN TRANSACTION; 
    ALTER SCHEMA shadow TRANSFER Sales.SalesReason; 
    ALTER SCHEMA Sales TRANSFER cache.SalesReason; 
COMMIT TRANSACTION; 

ALTER SCHEMA cache TRANSFER shadow.SalesReason; 
TRUNCATE TABLE cache.SalesReason; 
-- truncate is optional - I usually kept the data around for debugging 

,如果你有外鍵和其他依賴,當然它完全無效的統計數據等,這將無法正常工作,這反過來又可以會影響計劃,但如果最重要的是以最少的中斷在用戶面前獲取準確的數據,則可以考慮這種方法。

+0

+1,非常酷:)我可能稍後會接受。這就像一個容器的C交換函數,哈哈。 – 2012-08-09 15:50:12

+0

如何切換分區?這也適用於非分區表。 – usr 2012-08-09 16:16:42

+0

@ usr可能,我還沒有真正探索過。我通常只准備對我用過的技術進行權威性的講話,因此我知道他們的工作。 :-) – 2012-08-09 16:18:37