メモ T-SQL INSERT - SELECT で登録された IDENTITY と 元データの値を紐づける

以前調べたのをメモってなかったので + 使おうかなと思う機会があったのでメモ。

昔調べた時の元ネタはこちら

output を使って書きたいけど、シンプルに書けないのがネック。。
OUTPUT 句 (TRANSACT-SQL) | Microsoft Docs

from_table_name
DELETE、UPDATE、または MERGE ステートメントの FROM 句に含まれるテーブルを指定する列プレフィックスです。更新または削除する行を指定するために使用します。 

output で返す対象が、delete, update, merge のときだけ、from_table_name 使えるって書いてあるので、insert も無理やり merge で書く感じ。

stackoverflow にも…
sql server - What columns can be used in OUTPUT INTO clause? - Stack Overflow
on (1 = 0) に違和感なければありなんかなー。


を拝借して、merge で書き換えたのをメモっとく。

DECLARE @registered AS TABLE (Id bigint, A int, B int);

MERGE Table2 dest USING SELECT A FROM Table1 src on (1 = 0)
WHEN NOT MATCHED THEN INSERT (A) VALUES (src.A)
OUTPUT INSERTED.Id, src.A INTO @registered
;
/*
INSERT INTO Table2 (A)
OUTPUT INSERTED.Id, INSERTED.A, t1.B INTO @registered -- ここに t1.B は書けない
SELECT A FROM Table1 AS t1
;
*/
 
INSERT INTO Table3 (Id, B)
SELECT r.Id, r.B FROM @registered AS r