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

テーブルの大規模なスワップを実行している場合、1つの方法は、2つの追加スキーマを作成することです。

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 に答える