SQL Serverは、挿入したデータのID番号を取得します。

6514 ワード

転載先:http://blog.csdn.net/mzpmzk/article/details/51488494
第一の方法:insert into table 1 values(colvalue 1,colvalue 2)
select ident(u)current('table 1')
 
第二の方法:insert into table 1 values(colvalue 1,colvalue 2)select@dentity
 
主にTransact-SQLの関数を使用します。
1、IDENT_CURRENT()      
2、SQL Server 2000標識関数SCOPE_IDENTITY()
3、SQL Server 2000標識関数@IDENTITY
 
IDENT_CURRENT() 
あるセッションおよびスコープで指定されたテーブルまたはビューとして生成された最新の識別値を返します。
構文
IDENT_CURRENT( 'table_name' )
コメント
IDENT_CURRENTはSQL Server 2000標識関数SCOPE_に類似している。IDENTITYと@IDENTITY。これらの3つの関数は、最後に生成された識別値を返します。しかし、上記の各関数で定義される「最後」のスコープとセッションは異なる。
IDENT_CURRENTは、あるセッションとドメインの指定テーブルで生成された最新の識別値を返します。@IDENTITYは、現在のセッションのすべてのスコープにまたがって生成された最新の識別値を返します。SCOPE_IDENTITYは、現在のセッションと現在のスコープのいずれかのテーブルで生成された最新の識別値を返します。空の表でIDENT_を呼び出します。CURRENT関数の場合、この関数はNULLに戻ります。
ステートメントとトランザクションが失敗した場合、テーブルの現在の識別情報が変更され、識別された列の値が不連続になります。表に値を挿入しようとするトランザクションが提出されていなくても、マーク値をロールバックできません。例えば、IGNOREで_DUP_.KEY衝突によりINSERT文が失敗しました。表の現在の識別値は依然として増加します。
パラメータ
テーブルname
その識別値が返されるテーブルの名前。テーブルnameのデータタイプはvarharで、デフォルト値はありません。
タイプを返します
sqlvariant

以下の例を表示します。  IDENT_CURRENT@@IDENTITY 和  SCOPE_IDENTITY は、異なる識別値を返します。
USE AdventureWorks; GO DROP TABLE t6; DROP TABLE t7; GO CREATE TABLE t6(id int IDENTITY); CREATE TABLE t7(id int IDENTITY(100,1)); GO CREATE TRIGGER t6ins ON t6 FOR INSERT AS BEGIN INSERT t7 DEFAULT VALUES END; GO --End of trigger definition SELECT * FROM t6; --id is empty. SELECT * FROM t7; --ID is empty. --Do the following in Session 1 INSERT t6 DEFAULT VALUES; SELECT @@IDENTITY; SELECT SCOPE_IDENTITY(); SELECT IDENT_CURRENT('t7'); SELECT IDENT_CURRENT('t6'); -- Do the following in Session 2. SELECT @@IDENTITY; SELECT SCOPE_IDENTITY(); SELECT IDENT_CURRENT('t7');
 
 
SCOPE_IDENTITY()
同じスコープに挿入された識別列の最後の識別値を返します。一つの範囲はモジュールです。プロセス、触発器、関数またはバッチ処理です。したがって、2つのステートメントが同じ格納プロセス、関数、またはバッチ処理中である場合、それらは同じ作用領域にある。
構文
SCOPE_IDENTITY()
コメント
SCOPE_IDENTITY、IDENT_CURRENTと@@IDENTITYは、いずれも識別された列に挿入された値を返すために似た関数である。
IDENT_CURRENTは、スコープおよびセッションによって制限されず、指定されたテーブルに制限される。IDENT_CURRENTは、任意のセッションおよびスコープ内の特定のテーブルによって生成された値を返します。詳細については、 IDENT_CURRENT(Transact-SQL)
SCOPE_IDENTITYと@@IDENTITYは、現在のセッションのいずれかのテーブルで生成された最後の識別値を返します。しかし、SCOPE_IDENTITYは現在のスコープに挿入された値だけを返します。@IDENTITYは特定の作用領域に限定されない。
例えば、2つのテーブルT 1とT 2があり、T 1にINSERTフリップフロップが定義されている。ある行をT 1に挿入すると、トリガーが励起され、T 2に1行が挿入される。このスキームは、T 1における挿入とT 2におけるフリップフロップの挿入との2つの作用領域を実証する。
T 1とT 2には識別列があると仮定します。@IDENTITYとSCOPE_IDENTITYはT 1のINSERT文の最後に異なる値を返します。@IDENTITYは、現在のセッションのいずれかのアクティブ領域に挿入された最後の識別列の値を返します。これはT 2に挿入された値です。SCOPE_IDENTITY()は、T 1に挿入されたIDENTITY値に戻ります。これは同じ作用領域で発生する最後の挿入である。任意のINSERT文がスコープ内の識別列として機能する場合は、SCOPE(u)を呼び出します。IDENTITY()関数は、空の値を返します。
ステートメントとトランザクションが失敗した場合、テーブルの現在の識別情報が変更され、識別された列の値が不連続になります。表に値を挿入しようとするトランザクションが提出されていなくても、マーク値をロールバックできません。例えば、IGNOREで_DUP_.KEY衝突によりINSERT文が失敗しました。表の現在の識別値は依然として増加します。
タイプを返します
numeric

以下の列は2つのテーブルを作成します。TZ 和  TY  TZ でINSERTトリガーを作成します。行を表に挿入すると  TZ の場合は、フリップフロップ(Ztrig)が励起され、  TY に行を挿入します
USE tempdb GO CREATE TABLE TZ ( Z_id int IDENTITY(1,1)PRIMARY KEY, Z_name varchar(20) NOT NULL) INSERT TZ VALUES ('Lisa') INSERT TZ VALUES ('Mike') INSERT TZ VALUES ('Carla') SELECT * FROM TZ --Result set: This is how table TZ looks. Z_id Z_name ------------- 1 Lisa 2 Mike 3 Carla CREATE TABLE TY ( Y_id int IDENTITY(100,5)PRIMARY KEY, Y_name varchar(20) NULL) INSERT TY (Y_name) VALUES ('boathouse') INSERT TY (Y_name) VALUES ('rocks') INSERT TY (Y_name) VALUES ('elevator') SELECT * FROM TY --Result set: This is how TY looks: Y_id Y_name --------------- 100 boathouse 105 rocks 110 elevator CREATE TRIGGER Ztrig ON TZ FOR INSERT AS BEGIN INSERT TY VALUES ('') END INSERT TZ VALUES ('Rosalie') SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY] GO SELECT @@IDENTITY AS [@@IDENTITY] GO
以下は結果集です。 
SCOPE_IDENTITY 4 @@IDENTITY 115
 
@IDENTITY
 
最後に挿入した識別値のシステム関数を返します。
 
構文
@@IDENTITY
コメント
一つのINSERT、SELECT INTOまたは大容量コピー文が完成したら、@@IDENTITYにはステートメント生成の最後の識別値が含まれます。ステートメントが識別された列を含むテーブルに影響しない場合、@@IDENTITYはNULLに戻ります。複数の行を挿入し、複数の識別値が生成されると、@@IDENTITYは最後に生成された識別値を返す。ステートメントが1つまたは複数のトリガーをトリガした場合、トリガーはまた識別値を生成する挿入動作を実行すると、ステートメント実行直後に@@IDENTITYを呼び出してトリガー生成の最後の識別値に戻ります。識別された列を含むテーブルに挿入操作を行い、フリップフロップがトリガされ、他の識別されていない列のテーブルにフリップフロップが挿入操作を行った場合、@IDENTITYは、最初に挿入された識別値に戻ります。INSERTやSELECT INTO文の失敗や大容量コピーに失敗したり、事務がロールバックされたりした場合、@@IDENTITY値は以前の設定に戻りません。
ステートメントとトランザクションが失敗した場合、テーブルの現在の識別情報が変更され、識別された列の値が不連続になります。表に値を挿入しようとするトランザクションが提出されていなくても、マーク値をロールバックできません。例えば、IGNOREで_DUP_.KEY衝突によりINSERT文が失敗しました。表の現在の識別値は依然として増加します。
@IDENTITY、SCOPE_IDENTITYとIDENT_CURRENTはテーブルに挿入されたIDENTITY列の最後の値を返すので、似たような関数です。
@IDENTITYとSCOPE_IDENTITYは、現在のセッションのすべてのテーブルで生成された最後の識別値を返すことができる。しかし、SCOPE_IDENTITYは現在のスコープ内でのみ値を返しますが、@@IDENTITYは特定のスコープに限定されません。
IDENT_CURRENTは、スコープおよびセッションによって制限されず、指定されたテーブルに制限される。IDENT_CURRENTは、任意のセッションおよび任意のアクティブ領域において特定のテーブルのために生成された識別値を返すことができる。詳細については、 IDENT_CURRENT(Transact-SQL)
@IDENTITY関数のスコープは、この関数を実行するローカルサーバ上の現在のセッションです。この関数はリモートやリンクサーバに適用できません。他のサーバ上の識別値を取得する場合は、リモートサーバまたはリンクサーバ上で格納プロセスを実行し、(リモートまたはリンクサーバの環境で実行される)この格納プロセスに識別値を収集し、それをローカルサーバ上の呼び出しの接続に戻してください。
タイプを返します
numeric

以下の例は、識別列(LocationID)を含むテーブルに行を挿入し、使用する。  @@IDENTITY 新しい行で使用する識別値を表示します。
USE AdventureWorks; GO --Display the value of LocationID in the last row in the table. SELECT MAX(LocationID) FROM Production.Location; GO INSERT INTO Production.Location (Name, CostRate, Availability, ModifiedDate) VALUES ('Damaged Goods', 5, 2.5, GETDATE()); GO SELECT @@IDENTITY AS 'Identity'; GO --Display the value of LocationID of the newly inserted row. SELECT MAX(LocationID) FROM Production.Location; GO