当前位置:  开发笔记 > 编程语言 > 正文

获取新的SQL记录ID

如何解决《获取新的SQL记录ID》经验,为你挑选了3个好方法。

如何获取刚刚插入的新记录的自动生成ID?(使用ASP classic和MSSQL 2005)



1> Scott Ivey..:
SELECT SCOPE_IDENTITY() 

使用@@ IDENTITY可能会产生意外结果,因此请小心使用该结果.将记录插入其他表的触发器将导致@@ IDENTITY值发生更改 - 其中SCOPE_IDENTITY()将仅从您当前作用域中为您提供最后一个标识.

这是一个示例,它将显示@@ 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

这里没有人讨论的另一个选项是使用SQL 2005中的OUTPUT子句.在这种情况下,您只需要将insert子句添加到insert中,然后从代码中捕获该记录集.插入多个记录而不只是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;



2> BradC..:

SELECT @@ IDENTITY通常有效,但可以返回由于触发器或其他东西而不是原始文件而插入的记录的标识.

SELECT SCOPE_IDENTITY是我推荐的.它返回仅在当前范围内插入的值.

还有一个"IDENT_CURRENT(tablename)",它返回为特定表插入的最后一个标识.



3> Joel Coehoor..:

有三种方法可以获得sql中的最后一个标识.

其他人已经提到过它们,但为了完整性:

@@ IDENTITY - 也可以返回在同一范围内的其他对象中创建的id(想想触发器)

IDENT_CURRENT - 仅限于表,但不限于您的范围,因此它可以为繁忙的表提供错误的结果

Scope_Idenity() - 仅限于请求的范围.使用这99%的时间

此外,有三种方法可以获取该ID并将其返回到您的客户端代码:

在存储过程中使用输出参数

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.例如,您的sql语句看起来像这样:

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")

不幸的是(或者幸运的是,从我的角度来看)我的经典ASP它远远地显示了客户端代码中前两个的例子.

推荐阅读
N个小灰流_701
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有