1

我在这里阅读 MSDN 网站: http ://technet.microsoft.com/en-us/library/bb510625.aspx

我对一件事有点困惑。

该站点的示例(在底部复制)使用该行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;
4

1 回答 1

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

如果您有外键和其他依赖项,这将不起作用,当然它会使统计信息等完全无效,这反过来会影响计划,但如果最重要的是在用户面前以最少的数量获得准确的数据中断,这可以是一种考虑的方法。

于 2012-08-09T15:45:33.203 回答