28

私はこの問題を1週間グーグルで検索しましたが、正しい単語を使用していないと思います。

SQL Server 2008をt-sqlで使用していますが、新しい行を挿入するときに関数を最適化する必要があります。

最初の列が整数自動インクリメントタイプのキーであり、他の列は情報のためだけのテーブルがあります

挿入を行うと、SQL Serverはキーを自動的にインクリメントし、値を取得するためにselect maxを実行する必要があるため、または関数のようなグローバル変数のよう@@IDENTITYに、開始終了トランザクションを回避してmaxを選択する方法があります。

4

4 に答える 4

46

使用SCOPE_IDENTITY

-- do insert

SELECT SCOPE_IDENTITY();

それはあなたに与えるでしょう:

同じスコープのID列に挿入された最後のID値。スコープはモジュールです:ストアドプロシージャ、トリガー、関数、またはバッチ。したがって、2つのステートメントが同じストアード・プロシージャー、関数、またはバッチにある場合、それらは同じスコープにあります。

于 2012-11-19T09:42:23.643 に答える
8

コードを実行しただけです:

INSERT INTO Persons (FirstName) VALUES ('Joe');
SELECT ID AS LastID FROM Persons WHERE ID = @@Identity;

そしてそれも機能します!

于 2014-10-15T12:10:24.227 に答える
4

最後の自動増分値についてはどうですか

SELECT IDENT_CURRENT('tableName')-IDENT_INCR('tableName');
于 2012-11-19T10:27:08.013 に答える
1

私の場合、ビューに挿入していたため、@@Identityを使用する必要がありました。SCOPE_IDENTITYは、明示的に作成したものに対してのみ機能するようです。

ここを参照してください:

http://blog.sqlauthority.com/2007/03/25/sql-server-identity-vs-scope_identity-vs-ident_current-retrieve-last-inserted-identity-of-record/

@@ IDENTITYは、現在のセッションでテーブルに入力された最後のID値を返します。@@ IDENTITYは現在のセッションに制限されていますが、現在のスコープに制限されていません。テーブルにトリガーがあり、別のテーブルにIDが作成される場合、それが作成されたトリガーであったとしても、最後に作成されたIDを取得します。

于 2016-10-25T16:12:13.517 に答える