-
创建数据库和表
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
--
返回当前会话所有表中生成的最后一个标示值