マイペース庶民

マイペースで生きたい

SQL Server のレコードコピーとIDENTITY_INSERT

SQL Serverでのテーブルコピーは

SELECT * INTO new_tbl FROM old_tbl;

レコードコピーは

INSERT INTO to_tbl SELECT * FROM from_tbl;

ところでSQL ServerではIDENTITYっていうもんがあって
IDENTITYを持つカラムに明示的に値を入れる場合には

SET IDENTITY_INSERT ON
INSERT INTO target_tbl(***, ***, ***,,) VALUES (***, ***, ***,,);
SET IDENTITY_INSERT OFF 

とするのだが
IDENTITYのあるテーブルにレコードコピーする際

SET IDENTITY_INSERT ON
INSERT INTO to_tbl SELECT * FROM from_tbl;
SET IDENTITY_INSERT OFF 

こんなんやると怒られる。
以下のように書き換える。

SET IDENTITY_INSERT ON
INSERT INTO to_tbl(***, ***, ***,,) SELECT * FROM from_tbl;
SET IDENTITY_INSERT OFF 

INSERT INTO での挿入先でのカラムの指定はしておこうというそういう話。
そもそものレコードコピーからそうすべきな気もする。