MW211 EXIT

devlog
MSSQL/自動採番の取得
2014年12月08日
┌──────────────────────────────────────┐
│CREATE TABLE 表 (                                                           │
│    [キー]              [int] IDENTITY(1,1) NOT NULL,                       │
│    [列]                [int]               NULL,                           │
│    CONSTRAINT [主キー] PRIMARY KEY CLUSTERED (                             │
│        [キー]              ASC                                             │
│    )                                                                       │
│);                                                                          │
└──────────────────────────────────────┘
上記のような自動採番する表があって、
採番直後にその値を取得する方法には以下がある。
                                          ┌─────┬─────┬─────┐
                                          │セッション│ スコープ │ テーブル │
┌──┬─────────────────┼─────┼─────┼─────┤
│案1│SELECT MAX(キー) FROM 表;         │   全て   │   全て   │ 指定のみ │
├──┼─────────────────┼─────┼─────┼─────┤
│案2│SELECT IDENT_CURRENT('表');       │   全て   │   全て   │ 指定のみ │
├──┼─────────────────┼─────┼─────┼─────┤
│案3│SELECT @@IDENTITY;                │ 自身のみ │   全て   │   全て   │
├──┼─────────────────┼─────┼─────┼─────┤
│案4│SELECT SCOPE_IDENTITY();          │ 自身のみ │ 自身のみ │   全て   │
└──┴─────────────────┴─────┴─────┴─────┘
  セッションが「全て」のものは、同時に他から更新された場合、
  その影響を受けてしまう。
  スコープが「全て」の場合は、トリガなどにより連動した結果も反映されてしまう。
  よって、案4が一番安全なようだ。
分類:MSSQL