-----------------------------------------------3种返回最大标识值的方法的不同点---------------------------------------
--测试数据表
create table test1 (id int identity(1,1),value int)
create table test2 (id int identity(1,1),value int)
create table test3 (id int identity(1,1),value int)
go
--建立触发器
create trigger tr_t1 on test1
after insert
as
begin
insert test2 values(1)
end
--1、@@IDENTITY 返回为当前会话的所有作用域中的任何表最后生成的标识值。
insert test2 values(3)
select @@IDENTITY
/*1*/
go
insert test1 values(1)
select @@IDENTITY
/*2*/
----居然不是这是为什么呢?-----
--因为它触发了test1上面的触发器这个时候它执行了向test2中插入一条记录,而test2上就有第二条记录,标识列就为了------------
truncate table test1
truncate table test2
--2、SCOPE_IDENTITY 返回为当前会话和当前作用域中的任何表最后生成的标识值。(防止返回触发器中的insert的IDENTITY值)
--------为了防止刚才的触发器引发的“错误”,我们利用SCOPE_IDENTITY函数---------
insert test2 values(3)
select SCOPE_IDENTITY()
/*1*/
go
insert test1 values(1)
select SCOPE_IDENTITY()
/*1*/
truncate table test1
truncate table test2
--3、IDENT_CURRENT 返回为任何会话和任何作用域中的特定表最后生成的标识值。
-----想任意的返回你想要的表的标识值,那么我们使用IDENT_CURRENT--------------
insert test2 values(3)
select IDENT_CURRENT('test2')
/*1*/
go
insert test1 values(1)
select IDENT_CURRENT('test2')
/*2*/
select IDENT_CURRENT('test1')
/*1*/