以前調べたのをメモってなかったので + 使おうかなと思う機会があったのでメモ。
昔調べた時の元ネタはこちら
SQL で、テーブル1 (A,B) から SELECT してテーブル2 (Id, A) に INSERT した後、テーブル3 (テーブル2のId, B) に SELECT INSERT ってどうやるんじゃっけ。
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) に違和感なければありなんかなー。
@shinsukeoda こういう SQL はダメっぽいのです URL
を拝借して、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