投稿者 魔界の仮面弁士  (社会人) 投稿日時 2023/3/1 10:47:21
番号を予約する手法を採る場合は、IDENTITY よりも SEQUENCE の方が向いています。
複数の番号を予約するための sp_sequence_get_range も使えますしね。
https://learn.microsoft.com/ja-jp/sql/t-sql/statements/create-sequence-transact-sql?WT.mc_id=DT-MVP-8907&view=sql-server-ver16
https://learn.microsoft.com/ja-jp/sql/relational-databases/system-stored-procedures/sp-sequence-get-range-transact-sql?WT.mc_id=DT-MVP-8907&view=sql-server-ver16

あるいは UNIQUEIDENTIFIER型 にしておいて、NEWID() 等で生成する手法もあります。

IDENTITY を使う場合、sp_sequence_get_range に相当する機能が無いため、
案1) 1 行ずつ挿入して、 IDENT_CURRENT / SCOPE_IDENTITY / @@IDENTITY を都度取得
案2) ワークテーブルに複数行挿入し、トリガーでどうにかする
などの手間がかかってしまうので、自分は敬遠しています。
ID 自体に意味のない、アクセスログの記録なんかには便利なのですが、
外部キーとして使うのには向いていないと思います。


🔹 @@IDENTITY
現在のセッション内で、
どのテーブルで生成されたかに関わらず、
最後にインサートされた IDENTITY の値を返す。


🔹 SCOPE_IDENTITY()
現在のセッション内かつ現在のスコープ内で、
どのテーブルで生成されたかに関わらず、
最後にインサートされた IDENTITY の値を返す。


🔹 IDENT_CURRENT('table_name')
セッションやスコープに関わらず、
指定したテーブルに対して
最後に生成された IDENTITY の値を返す。