ちょうど挿入した新しいレコードの自動生成されたIDを取得するにはどうすればよいですか? IDENTITYを使用して@@ (ASPを使用したクラシックとMSSQL 2005)新しいSQLレコードIDを取得
答えて
誰もが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をいつでも使用することができます。
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;
SELECT @@ IDENTITYは通常動作しますが、理由はトリガーか何かではなく、元の挿入されたレコードのIDを返すことができます。
SELECT SCOPE_IDENTITYは私がお勧めするものです。現在のスコープ内にのみ挿入された値を返します。
特定のテーブルのために挿入された最後のIDを返します「IDENT_CURRENT(テーブル名)は、」もあります。それは最後のオートは、あなたの現在の範囲内でIDを生成し返すため
SELECT @@アイデンティティまたはSELECT SCOPE_IDENTITY()は、両方の仕事はしかしSCOPE_IDENTITYを選択する()より安全です。たとえば、ScopeIDTableというテーブルがあるとします。このテーブルにはトリガーがあります。このトリガーは、TriggerIdTableのレコードに両方のテーブルに自動インクリメント列が挿入されます。
あなたはSELECT @@アイデンティティを使用している場合は、Idがトリガー(TriggerIdTable)内から生成される、そのセッションの最後の自動インクリメントを取得します。
あなたがSELECT SCOPE_IDENTITY()を使用する場合は、あなたのScopeIdTableからIDを取得します。
最後の身元をにする方法は3つあります。です。
彼らはすでに他の人が言及したが、完全を期すためた:
は- @@ IDENTITY -
- IDENT_CURRENTも同じスコープ内の他のオブジェクトで作成されたidを返すことができます(トリガを考える) - に限定あなたのスコープではないが、ビジーなテーブルに悪い結果を与える可能性があります。
- Scope_Idenity() - 要求の範囲に制限されています。
ストアドプロシージャで出力パラメータを使用します。また、そのIDを取得し、クライアントコードにそれをを返すために3つの方法があります
に
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文は次のようになります。
あなたはそれで何かを行う前に、同じデータベース接続を使用してクエリ
select scope_identity()
を実行します。結果は、おそらく予想通り、単一のフィールドを持つ単一の行を含むレコードセットです。あなたは、インデックス0を使用してフィールドにアクセスすることができ、またはあなたがすることを好む場合、あなたはそれに名前を付けることができます。
複数のレコードは、それがより面白くすることができ、セットベースの方法で一度に挿入する必要がselect scope_identity() as lastId
を。
私は時にはクライアントサイドで生成されたGUIDを使用していました(しかし、古典的なASPでは値を生成するためにユーティリティを使用する必要があります)、またはより多くの場合、サーバー側のGUIDキー列にNEWSQUENTIALID
私はGIUDSを好んでいるとは思っていませんが、いくつかの理由があります(そのサイズと、それがインデックス/ページングにどのように影響するか)。
http://www.sqlmag.com/Articles/Index.cfm?ArticleID=50164&pg=2
1は、これまで明らかに
select scope_identity()
以来
@@identity
を使用する理由私はいつも疑問にほとんどがスコットが求めているものを達成するための方法を保存しています。
- 1. mongoDBで新しいレコードのIDを取得する方法は?
- 2. SQL、最新の関連レコードを取得
- 3. レコードを更新していますが、レコードID以外の値を取得していますID
- 4. CodeIgniter:新しく作成したレコードのIDを取得する
- 5. Entity Frameworkで新しいレコードのID列を取得していますか?
- 6. SQLクエリを作成して最新のレコードを取得する
- 7. テーブル内の重複レコードから最新のIDを取得
- 8. MySQL:テーブル内の重複レコードから最新IDを取得
- 9. 最新のレコードを取得
- 10. 私のSQLでレコードを更新したいのですが、正しいIDを取得していないすべてのデータを更新します
- 11. SQL内の各グループに対して新しいId + 1を取得
- 12. SQLは、各ユーザーの最新のレコードを取得する
- 13. SQL Serverのテーブルから最新のレコードを取得
- 14. 最新のレコードを取得するSQL LIMIT
- 15. 'pg' gemを使って新しく挿入されたレコードのIDを取得
- 16. テーブルフィールドの全量を合計して最新の最終レコードIDを取得
- 17. SQL Serverテーブルの新しく追加されたレコードからID番号を取得する方法は? (asp.net)
- 18. レコードを取得せずにbelongsTo IDを取得
- 19. テーブル内の特定のIDの最新のレコードを取得します
- 20. スウィッチスクリプト・マトリクス項目レコード取得不可ID
- 21. SQL GROUP BY:インデックス付きビューの最新のレコードの取得
- 22. テーブルを比較して新しいレコードを取得する
- 23. cakephp編集ページで古いレコードと新しいレコードを取得する
- 24. SQLで別のレコードを取得
- 25. ユニークなレコードを取得するOracle SQL
- 26. SQL Server 2008 R2でトリガを作成してレコードの更新を取得する
- 27. 別のレコードからそのIDを取得した後でMongoのレコードを更新する
- 28. SQL Serverからレコードを取得しない
- 29. SQL Server 2012のテーブルから最後に更新されたレコードのIDを取得する方法
- 30. MySQL:最新のレコードを取得
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
「を使用して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