2016-08-15 4 views
0

私は、クライアントから毎週更新されるテーブルtblstars_newを持っています。私はtblstars_newから新しいデータと更新されたデータをインポートする必要がある別のテーブルtblstarsを持っています。値が一致しないためのMERGEステートメントの作成

tblstarsに存在しないtblstars_newの行を検索してからtblstarsに追加するのは簡単です。

しかし、私はまた、列PandA_Codeが変更されたtblstars_newの行を見つけて、tblstarsの同じ行を更新する必要があります。

このクエリは、tblstars_newのどの行が変更され、tblstarsで更新する必要があるPandA_Codeを持つかを示します。

SELECT 
    sn.* 
FROM 
    tblstars_new sn 
    JOIN tblstars s ON sn.Student_ID_Number = s.Student_ID_Number AND sn.PandA_Code != s.PandA_Code 

私は変更を行うMERGEステートメントを見つけようとしています。私がプロードでやっているように、私は本当に遊ぶことができません。 2つの質問:

1)実際に変更を加えずに変更を確認することはできますか?

2)以下のMERGE文は正しいですか?

BEGIN TRAN; 
MERGE tblstars AS T   -- Target 
USING tblstars_new AS S  -- Source 
ON 
    (T.Student_ID_Number = S.Student_ID_Number AND T.PandA_Code != S.PandA_Code) 
WHEN NOT MATCHED BY TARGET 
    THEN 
    UPDATE SET T.PandA_Code = S.PandA_Code 
OUTPUT $action; 
ROLLBACK TRAN; 
GO 
+0

両方のテーブルのバックアップをとり、新しい名前で保存してからテストしてください。私はそれが問題の原因にならないことを願っており、100倍も安全です。 – Zi0n1

+0

〜私はちょうどマッチしたときにマッチしてもうまく動作するかもしれないが、テストしていないと思う。 – bhs

+0

@ sboahraの答えがあなたの問題を解決したのはどういうわけか 'tblstars_newから新しいデータや更新されたデータをインポートする必要がある。新しい**? –

答えて

1

これは単にMERGE文の代わりに結合を使用して行われる。ここで

UPDATE T SET T.PandA_Code = S.PandA_Code FROM tblstart T 
INNER JOIN tblstars_new P ON P.Student_ID_Number = T.Student_ID_Number 
WHERE T.PandA_Code <> S.PandA_Code 
2

はあなたの要求を満たすMERGEクエリです。

BEGIN TRAN; 
MERGE tblstars AS T   -- Target 
USING tblstars_new AS S  -- Source 
ON T.Student_ID_Number = S.Student_ID_Number -- They shoudl match by PK 
WHEN MATCHED AND AND T.PandA_Code != S.PandA_Code 
    THEN     -- when matched and PandA_Code different update them 
    UPDATE SET T.PandA_Code = S.PandA_Code 
WHEN NOT MATCHED BY TARGET -- When not matched by TARGET (there is in source but not in target) 
    THEN INSERT (<field1, field2, ...>) 
     VALUES (<S.field1, S.filed2, ...>) -- then insert them 
OUTPUT deleted.*, $action, inserted.* INTO #TheTempTable; 
SELECT * FROM #TheTempTable; -- here you can see the cnages and rollback if something is wrong 
ROLLBACK TRAN; 
GO 
関連する問題