web-dev-qa-db-ja.com

SQL Serverで最後に挿入された行を抽出する方法は?

INSERTステートメントを実行すると、1つ以上の行がテーブルに挿入されますが、SQL Serverで最後に挿入された行を抽出する方法はありますか?

7
user2493976

定義により、テーブルは行の順序付けされていないバッグです( ここの#3を参照してください )。最後に挿入された行をSQL Serverに確認する方法はありません(= /// =)が、挿入と同じバッチでそうしている場合を除きます。たとえば、テーブルにIDENTITY列がある場合、 SCOPE_IDENTITY() を使用できます(_@@IDENTITY_は絶対に使用しないでください。または、ソーステーブルにトリガーを追加します):

_INSERT dbo.table(column) SELECT 1;
SELECT SCOPE_IDENTITY();
_

より一般的には、OUTPUT句を使用できます。これは、IDENTITY列に依存しません(ただし、句がない場合、句が識別する行を特定することは困難です) PK):

_INSERT dbo.table(column) OUTPUT inserted.* SELECT 1;
_

同じバッチについて話していない場合、挿入された最後の行を識別する唯一の実際の方法は、挿入のタイムスタンプが記録されている日付/時刻列を使用することです。それ以外の場合は、床にあるビー玉の袋を空にして、誰かに部屋に入って最後に床に当たったものを特定するように依頼したようなものです。

IDENT_CURRENT() 関数を使用したくなるかもしれませんが、 ここで説明します これも信頼できない理由。

これを追跡するための列を追加できます。

_ALTER TABLE dbo.table ADD DateInserted DEFAULT CURRENT_TIMESTAMP;
_

これで、挿入された最後の行を簡単に見つけることができます。

_;WITH x AS (SELECT *, r = RANK() OVER (ORDER BY DateInserted DESC)
   FROM dbo.table)
SELECT * FROM x WHERE r = 1;
_

(タイが必要ない場合は、タイブレーク列を_ORDER BY_に追加するか、必要ない場合はRANK()ROW_NUMBER()に変更するだけです。結ばれた行のどれを取得するか注意してください。)

挿入された最後の行が最も高いID値であると想定する場合がありますが、これは必ずしもそうではありません。 IDは再シードでき、_SET IDENTITY_INSERT ON;_を使用してオーバーライドすることもできます。

16
Aaron Bertrand