SqlServer中实现返回刚插入记录的ID
发布时间:2020-12-12 13:08:56 所属栏目:MsSql教程 来源:网络整理
导读:?? - 创建数据库和表 ? create database MyDataBase ? use MyDataBase ? create table mytable ? id int identity ( 1 , 1 ), ? name varchar ( 20 ) ? ) ? -- 执行这个 SQL ,就能查出来刚插入记录对应的自增列的值 ? insert into mytable values (
??
-
创建数据库和表
?
create database MyDataBase
?
use MyDataBase
?
create table mytable
?
id int identity
(
1
,
1
),
?
name varchar
(
20
)
?
)
?
--
执行这个
SQL
,就能查出来刚插入记录对应的自增列的值
?
insert into mytable values
(
'
李四
'
)
?
select @@identity
?
三种方式的比较
?
SQL Server 2000
中,有三个比较类似的功能
:
他们分别是
:SCOPE_IDENTITY
、
IDENT_CURRENT
和
@@IDENTITY
,它们都返回插入到
IDENTITY
列中的值。
?
IDENT_CURRENT
返回为任何会话和任何作用域中的特定表最后生成的标识值。
IDENT_CURRENT
不受作用域和会话的限制,而受限于指定的表。
IDENT_CURRENT
返回为任何会话和作用域中的特定表所生成的值。
?
@@IDENTITY
返回为当前会话的所有作用域中的任何表最后生成的标识值,触发器执行的insert into 语句也在会话中。
?
SCOPE_IDENTITY
返回为当前会话和当前作用域中的任何表最后生成的标识值
?
SCOPE_IDENTITY
和
@@IDENTITY
返回在当前会话中的任何表内所生成的最后一个标识值。但是,
SCOPE_IDENTITY
只返回插入到当前作用域中的值;
@@IDENTITY
不受限于特定的作用域。
?
例如,有两个表
T1
和
T2
,在
T1
上定义了一个
INSERT
触发器。当将某行插入
T1
时,触发器被激发,并在
T2
中插入一行。此例说明了两个作用域
:
一个是在
T1
上的插入,另一个是作为触发器的结果在
T2
上的插入。
?
假设
T1
和
T2
都有
IDENTITY
列,
@@IDENTITY
和
SCOPE_IDENTITY
将在
T1
上的
INSERT
语句的最后返回不同的值。
?
@@IDENTITY
返回插入到当前会话中任何作用域内的最后一个
IDENTITY
列值,该值是插入
T2
中的值。
?
SCOPE_IDENTITY
()
返回插入
T1
中的
IDENTITY
值,该值是发生在相同作用域中的最后一个
INSERT
。如果在作用域中发生插入语句到标识列之前唤醒调用
SCOPE_IDENTITY
()
函数,则该函数将返回
NULL
值。
?
而
IDENT_CURRENT
(
'T1'
)
和
IDENT_CURRENT
(
'T2'
)
返回的值分别是这两个表最后自增的值。
?
ajqc
的实验
:
(
40
条本地线程,
40
+
40
条远程线程同时并发测试,插入
1200W
行),得出的结论是
:
?
1.
在典型的级联应用中
.
不能用
@@IDENTITY
,在
CII850
,
256M
SD
的机器上
1W
多行时就会并发冲突
.
在
P42.8C
,
512M
DDR
上,才
6000
多行时就并发冲突
.
?
2.SCOPE_IDENTITY
()是
绝对可靠的
,可以用在存储过程中,连触发器也不用建,没并发冲突
?
SELECT IDENT_CURRENT
(
'TableName'
)
--
返回指定表中生成的最后一个标示值
?
SELECT IDENT_INCR
(
'TableName'
)
--
返回指定表的标示字段增量值
?
SELECT IDENT_SEED
(
'TableName'
)
--
返回指定表的标示字段种子值
?
返回最后插入记录的自动编号
?
SELECT IDENT_CURRENT
(
'TableName'
)
?
返回下一个自动编号
:
?
SELECT IDENT_CURRENT
(
'TableName'
)
+
(
SELECT IDENT_INCR
(
'TableName'
))
?
SELECT @@IDENTITY
--
返回当前会话所有表中生成的最后一个标示值
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |