都内で働くSEの技術的なひとりごと / Technical soliloquy of System Engineer working in Tokyo

都内でサラリーマンやってます。SQL Server を中心とした (2023年からは Azure も。) マイクロソフト系(たまに、OSS系などマイクロソフト以外の技術も...)の技術的なことについて書いています。日々の仕事の中で、気になったことを技術要素関係なく気まぐれに選んでいるので記事内容は開発言語、インフラ等ばらばらです。なお、当ブログで発信、発言は私個人のものであり、所属する組織、企業、団体等とは何のかかわりもございません。ブログの内容もきちんと検証して使用してください。英語の勉強のため、英語の

『質問に答えてみた』に内容を追加してみた

 会議中に少しだけ。下記の記事内容に少し補足します。
ryuchan.hatenablog.com
 
 MERGE 文でどのように更新および追加したかを判断する方法です。MERGE 文に OUTPUT $action, Inserted.*,Deleted.* を追加します。また、結果を格納するレイアウトとして下記の一時テーブルを用意します。

CREATE TABLE 
    #Result (
    action NVARCHAR ( 32 ),    -- 動作を格納(INSERT,UPDATE,DELETE)
    col1 INT NOT NULL,         -- 今回更新された col1 の内容
    col2 INT NOT NULL,         -- 今回更新された col2 の内容
    col3 NVARCHAR ( 256 ),     -- 今回更新された col3 の内容
    prev_col1 INT,             -- 更新前の col1 の内容
    prev_col2 INT,             -- 更新前の col2 の内容
    prev_col3 NVARCHAR ( 256 ) -- 更新前の col3 の内容
);

 それでは、下記のクエリを SQL Server Management Studio で実行してみましょう。

CREATE TABLE 
    #Result (
    action NVARCHAR ( 32 ),    -- 動作を格納(INSERT,UPDATE,DELETE)
    col1 INT NOT NULL,         -- 今回更新された col1 の内容
    col2 INT NOT NULL,         -- 今回更新された col2 の内容
    col3 NVARCHAR ( 256 ),     -- 今回更新された col3 の内容
    prev_col1 INT,             -- 更新前の col1 の内容
    prev_col2 INT,             -- 更新前の col2 の内容
    prev_col3 NVARCHAR ( 256 ) -- 更新前の col3 の内容
);

SELECT
    col1,
col2,
    col3
INTO 
    #Temp_Table
FROM 
    Real_Table1; 
MERGE INTO 
    #Temp_Table t1
USING 
    Real_Table2 t2 ON 
    t2.col2 = t1.col2
        WHEN MATCHED THEN
            UPDATE SET t1.col3 = t2.col3
        WHEN NOT MATCHED THEN
            INSERT VALUES ( t2.col1, t2.col2, t2.col3 )
OUTPUT $action, Inserted.*,Deleted.* INTO #Result;

SELECT * FROM #Result

f:id:koogucc11:20160801081705p:plain
 
 基礎から学んでみるかな。

SQL Server 2016の教科書 開発編

SQL Server 2016の教科書 開発編