获取sql server中自增量之scope_identity(),@@Identity,IDENT_CURRENT的区别
2014-04-14 14:17
525 查看
http://www.lmwlove.com/ac/ID480
在sql server2005,如果要获某个表最新增加的自增量,我们都知道,可以使用COPE_IDENTITY、
IDENT_CURRENT 和 @@IDENTITY三个函数,因为它们都返回插入到标识列中的值。但这三个函数是不是不管什么时候,返回的值都一样的呢?答案是错的,本人以前正是因为没有理解到这三个函数的区别,所以取到了错误的自增量。
首先我们来看一下三个函数的定义:
@@IDENTITY:返回为跨所有作用域的当前会话中的某个表生成的最新标识值。
SCOPE_IDENTITY:返回为当前会话和当前作用域中的某个表生成的最新标识值。
IDENT_CURRENT:返回为某个会话和用域中的指定表生成的最新标识值。
在详解之前,我们先了解什么是会话与作用域:
sql会话:用户利用sql命令或使用查询分析器连接到数据库时,一个新的会话就建立了,一直到该连接断开,或者用户重置该连接为止,都处于同一个会话中。
作用域:如果多个语句处在同一个存储过程,函数,批处理中,那么它们位于相同的作用域中。
了解会话与作用域后,相信读者对以上三个函数都有了大概的理解了。我们再举个例子来说明。
假设有表T1与T2,T1与T2表都包含自增列ID。我们在T1表中使用insert触发器往T2中添加数据。
现在我们往T1表添加新数据,假设T1表新的ID值为1000,T1表的触发器往T2表添加数据T2表产生的新ID值
为2000,
那么执行完插入语句后马上执行
select @@IDENTITY
select SCOPE_IDENTITY()
select IDENT_CURRENT('T1')
select IDENT_CURRENT('T2')
返回值应为:
2000
1000
1000
2000
延伸提醒:我们在写插入语句时总喜欢返回最新的ID值,Sql一般是这样写的
insert into 表(列) values(值);
select @@IDENTITY
比如动软自动生成的代码就是如此,
其实@@IDENTITY是不保险的,SCOPE_IDENTITY()才是最保险的
附上另两个与自量列有关的函数:
1、获取标识列的种子值
可使用函数IDENT_SEED,用法:
SELECT IDENT_SEED ('表名')
2、获取标识列的递增量
可使用函数IDENT_INCR ,用法:
SELECT IDENT_INCR('表名')
在sql server2005,如果要获某个表最新增加的自增量,我们都知道,可以使用COPE_IDENTITY、
IDENT_CURRENT 和 @@IDENTITY三个函数,因为它们都返回插入到标识列中的值。但这三个函数是不是不管什么时候,返回的值都一样的呢?答案是错的,本人以前正是因为没有理解到这三个函数的区别,所以取到了错误的自增量。
首先我们来看一下三个函数的定义:
@@IDENTITY:返回为跨所有作用域的当前会话中的某个表生成的最新标识值。
SCOPE_IDENTITY:返回为当前会话和当前作用域中的某个表生成的最新标识值。
IDENT_CURRENT:返回为某个会话和用域中的指定表生成的最新标识值。
在详解之前,我们先了解什么是会话与作用域:
sql会话:用户利用sql命令或使用查询分析器连接到数据库时,一个新的会话就建立了,一直到该连接断开,或者用户重置该连接为止,都处于同一个会话中。
作用域:如果多个语句处在同一个存储过程,函数,批处理中,那么它们位于相同的作用域中。
了解会话与作用域后,相信读者对以上三个函数都有了大概的理解了。我们再举个例子来说明。
假设有表T1与T2,T1与T2表都包含自增列ID。我们在T1表中使用insert触发器往T2中添加数据。
现在我们往T1表添加新数据,假设T1表新的ID值为1000,T1表的触发器往T2表添加数据T2表产生的新ID值
为2000,
那么执行完插入语句后马上执行
select @@IDENTITY
select SCOPE_IDENTITY()
select IDENT_CURRENT('T1')
select IDENT_CURRENT('T2')
返回值应为:
2000
1000
1000
2000
延伸提醒:我们在写插入语句时总喜欢返回最新的ID值,Sql一般是这样写的
insert into 表(列) values(值);
select @@IDENTITY
比如动软自动生成的代码就是如此,
其实@@IDENTITY是不保险的,SCOPE_IDENTITY()才是最保险的
附上另两个与自量列有关的函数:
1、获取标识列的种子值
可使用函数IDENT_SEED,用法:
SELECT IDENT_SEED ('表名')
2、获取标识列的递增量
可使用函数IDENT_INCR ,用法:
SELECT IDENT_INCR('表名')
相关文章推荐
- 关于如何使用SqlServer中@@Identity、@@IDENT_CURRENT、@@SCOPE_Identity获取自动生成列的值的区别(精简版)
- sql 中获取最后生成的标识值 IDENT_CURRENT ,@@IDENTITY ,SCOPE_IDENTITY 的用法和区别
- Sql Server插入数据并返回自增ID,@@IDENTITY,SCOPE_IDENTITY和IDENT_CURRENT的区别
- SQL 获取 IDENTITY 三种方法 SCOPE_IDENTITY、IDENT_CURRENT 和 @@IDENTITY的区别
- SQL 获取最新ID,scope_identity() ,@@identity,ident_current
- @@IDENTITY、IDENT_CURRENT、SCOPE_IDENTITY的区别
- scope_identity(), @@IDENTITY, IDENT_CURRENT()区别
- @@IDENTITY与SCOPE_IDENTITY() 及IDENT_CURRENT 的区别
- sql 中获取最后生成的标识值 IDENT_CURRENT ,@@IDENTITY ,SCOPE_IDENTITY 的用法和区别
- sql server 2000 @@identity、Scope_identity()、ident_current的区别
- SQL SERVER 插入数据获取自增ID,SCOPE_IDENTITY、IDENT_CURRENT 和 @@IDENTITY的比较
- sql 中获取最后生成的标识值 IDENT_CURRENT ,@@IDENTITY ,SCOPE_IDENTITY 的用法和区别
- sql server获取标识,获取最后ID IDENT_CURRENT、IDENTITY、SCOPE_IDENTITY区别
- @@IDENTITY和SCOPE_IDENTITY和IDENT_CURRENT的区别
- [转] 获取刚插入的数据的自增列ID——IDSCOPE_IDENTITY、IDENT_CURRENT 和 @@IDENTITY的区别(比较)
- sql server 2000 @@IDENTITY和SCOPE_IDENTITY和IDENT_CURRENT的区别
- [MSSQL]SCOPE_IDENTITY,IDENT_CURRENT以及@@IDENTITY的区别
- SCOPE_IDENTITY、IDENT_CURRENT 和 @@IDENTITY (插入后如何获取自增列的值)
- SCOPE_IDENTITY()、@@IDENTITY、IDENT_CURRENT() 用法
- SQL查询 [SCOPE_IDENTITY、IDENT_CURRENT 和 @@IDENTITY的区别(比较)]