2009-02-26 16 views
9

ちょうど挿入した新しいレコードの自動生成されたIDを取得するにはどうすればよいですか? IDENTITYを使用して@@ (ASPを使用したクラシックとMSSQL 2005)新しいSQLレコードIDを取得

+0

SELECT SCOPE_IDENTITY()を提案したすべての方に感謝します。 ようにスピン] (@NのVARCHAR(30) [DBO] GO ALTER PROCEDURE ON GO のSET QUOTED_IDENTIFIER ON のSET ANSI_NULLS INSERT INTO A(TRANSACTIONインを開始します。私は、ストアドプロシージャを作成することができましたN)VALUES(@N) SELECT NEWID = SCOPE_IDENTITY() – Keith

+0

「を使用してVBは、私はSPと呼ばれる:
設定CN = Server.CreateObjectに( "ADODB.Connectionの")を のconnectString = "DSN" cn.OpenのconnectString、 ( "EXEC [DB]。[dbo]。[A] @ Str ="&str)0 "、" PW0rd " rs = Server.CreateObject(" ADODB.Recordset ") セットrs = cn.Execute '値を返します。
resultID = rs(0) – Keith

答えて

0

誰もがSELECT SCOPE_IDENTITY()を提案してくれてありがとうございます。

USE [dbname] 
GO 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE PROCEDURE [dbo].[spInsert] 
(
    @Nn varchar(30) 
) 
AS 
BEGIN TRANSACTION InsertRecord 
    INSERT INTO A (Nn) 
    VALUES (@Nn) 
    SELECT NewID = SCOPE_IDENTITY() -- returns the new record ID of this transaction 
    COMMIT TRANSACTION InsertRecord 

とVBを使用してSPROCを呼び出します:私は、ストアドプロシージャを作成することができました

Dim strNn '<- var to be passed' 
Set cn = Server.CreateObject("ADODB.Connection") 
connectString = "DSN" 
cn.Open connectString, "user", "PW0rd" 
Set rs = Server.CreateObject("ADODB.Recordset") 
set rs = cn.Execute("EXEC [dbname].[dbo].[A] @Nn=" & strNn) 
'return the value' 
resultID = rs(0) 

私は今、私は新たに作成されたIDを参照するresultIdをいつでも使用することができます。

25
SELECT SCOPE_IDENTITY() 

はそうあなたが1ということをどのように使用するかを注意してください、予期しない結果を持つことができます。他のテーブルにレコードを挿入するトリガによって@@ IDENTITY値が変更されます。SCOPE_IDENTITY()は現在のスコープからの最後のIDを返します。誰もがここで議論していないことを別のオプションは、OUTPUT句を使用することです。ここ

はIDENTITYとSCOPE_INSERT(@@の違いを紹介しますサンプルです)とどのように異なる値を返すことができます。..

use tempdb 
go 
create table table1 
    (ID int identity) 
go 
create table table2 
    (ID int identity(100, 1)) 
go 
create trigger temptrig 
    on table1 
    for insert 
as 
begin 

    insert table2 
    default values; 

end 
go 
insert table1 
default values; 
select SCOPE_IDENTITY(), 
     @@IDENTITY 

この場合は、出力句を挿入するだけで、コードからそのレコードセットをキャッチするだけで済みます。これは、だけでなく1の複数のレコードを挿入するときに適しています...

use tempdb 
go 
create table table1 
    (ID int identity) 
go 
insert table1 
output inserted.ID 
default values; 
--OR... 
insert table1 
output inserted.$identity 
default values; 
9

SELECT @@ IDENTITYは通常動作しますが、理由はトリガーか何かではなく、元の挿入されたレコードのIDを返すことができます。

SELECT SCOPE_IDENTITYは私がお勧めするものです。現在のスコープ内にのみ挿入された値を返します。

特定のテーブルのために挿入された最後のIDを返します「IDENT_CURRENT(テーブル名)は、」もあります。それは最後のオートは、あなたの現在の範囲内でIDを生成し返すため

3

SELECT @@アイデンティティまたはSELECT SCOPE_IDENTITY()は、両方の仕事はしかしSCOPE_IDENTITYを選択する()より安全です。たとえば、ScopeIDTableというテーブルがあるとします。このテーブルにはトリガーがあります。このトリガーは、TriggerIdTableのレコードに両方のテーブルに自動インクリメント列が挿入されます。

あなたはSELECT @@アイデンティティを使用している場合は、Idがトリガー(TriggerIdTable)内から生成される、そのセッションの最後の自動インクリメントを取得します。

あなたがSELECT SCOPE_IDENTITY()を使用する場合は、あなたのScopeIdTableからIDを取得します。

9

最後の身元をにする方法は3つあります。です。

彼らはすでに他の人が言及したが、完全を期すためた:

  • @@ IDENTITY -
  • IDENT_CURRENTも同じスコープ内の他のオブジェクトで作成されたidを返すことができます(トリガを考える) - に限定あなたのスコープではないが、ビジーなテーブルに悪い結果を与える可能性があります。
  • Scope_Idenity() - 要求の範囲に制限されています。

    • ストアドプロシージャで出力パラメータを使用します。また、そのIDを取得し、クライアントコードにそれをを返すために3つの方法があります

    この時間の99%を使用します

    INSERT INTO [MyTable] ([col1],[col2],[col3]) VALUES (1,2,3); 
    SELECT @OutputParameterName = Scope_Identity(); 
    
  • 戻り値を使用してください。

    INSERT INTO [MyTable] ([col1],[col2],[col3]) VALUES (1,2,3); 
    Return Scope_Identity(); 
    
  • idを結果セットに選択します。それはあまりにも遠く、クライアントコードから最初の二つの例を表示するために行って、私のクラシックASP(私の視点から、幸いか、)残念ながら

    Dim ResultID As Integer 
    Dim strSQL As String 
    strSQL = "INSERT INTO [MyTable] ([col1],[col2],[col3]) VALUES (1,2,3); SELECT Scope_Identity();" 
    rsResults.Open strSQL, oConn 
    ResultID = rsResults("ID") 
    

:たとえば、SQL文は次のようになります。

1

あなたはそれで何かを行う前に、同じデータベース接続を使用してクエリ

select scope_identity() 

を実行します。結果は、おそらく予想通り、単一のフィールドを持つ単一の行を含むレコードセットです。あなたは、インデックス0を使用してフィールドにアクセスすることができ、またはあなたがすることを好む場合、あなたはそれに名前を付けることができます。

複数のレコードは、それがより面白くすることができ、セットベースの方法で一度に挿入する必要が
select scope_identity() as lastId 
0

を。

私は時にはクライアントサイドで生成されたGUIDを使用していました(しかし、古典的なASPでは値を生成するためにユーティリティを使用する必要があります)、またはより多くの場合、サーバー側のGUIDキー列にNEWSQUENTIALID

私はGIUDSを好んでいるとは思っていませんが、いくつかの理由があります(そのサイズと、それがインデックス/ページングにどのように影響するか)。

http://www.sqlmag.com/Articles/Index.cfm?ArticleID=50164&pg=2

1

1は、これまで明らかに

select scope_identity() 

以来

@@identity 

を使用する理由私はいつも疑問にほとんどがスコットが求めているものを達成するための方法を保存しています。

関連する問題