SQL Server 中@@IDENTITY的用法

原文地址:http://www.studyofnet.com/news/145.html

本文导读:@@IDENTITY是返回上次插入的标识值,标识值一般指的是自动增长值。但是如果想只返回插入到当前作用域中的值,则使用SCOPE_IDENTITY 。

用法:

用select @@identity得到上一次插入记录时自动产生的ID

如果你使用存储过程的话,将非常简单,代码如下:SET @[email protected]@IDENTITY

说明:

在一条 INSERT、SELECT INTO 或大容量复制语句完成后,@@IDENTITY 中包含此语句产生的最后的标识值。若此语句没有影响任何有标识列的表,则 @@IDENTITY 返回 NULL。若插入了多个行,则会产生多个标识值,@@IDENTITY 返回最后产生的标识值。如果此语句激发一个或多个执行产生标识值的插入操作的触发器,则语句执行后立即调用 @@IDENTITY 将返回由触发器产生的最后的标识值。若 INSERT 或 SELECT INTO 语句失败或大容量复制失败,或事务被回滚,则 @@IDENTITY 值不会还原为以前的设置。

如果语句和事务失败,它们会更改表的当前标识,从而使标识列中的值出现不连贯现象。即使未提交试图向表中插入值的事务,也永远无法回滚标识值。例如,如果因 IGNORE_DUP_KEY 冲突而导致 INSERT 语句失败,表的当前标识值仍然会增加。

在返回插入到表的 @@IDENTITY 列的最后一个值方面,@@IDENTITY、SCOPE_IDENTITY 和 IDENT_CURRENT 函数类似。

@@IDENTITY 和 SCOPE_IDENTITY 将返回在当前会话的所有表中生成的最后一个标识值。但是,SCOPE_IDENTITY 只在当前作用域内返回值,而 @@IDENTITY 不限于特定的作用域。

@@identity实例

USE AdventureWorks;

GO

--Display the value of LocationID in the last row in the table.

SELECT MAX(LocationID) FROM Production.Location;

GO

INSERT INTO Production.Location (Name, CostRate, Availability, ModifiedDate)

VALUES (‘Damaged Goods‘, 5, 2.5, GETDATE());

GO

SELECT @@IDENTITY AS ‘Identity‘;

GO

--Display the value of LocationID of the newly inserted row.

SELECT MAX(LocationID) FROM Production.Location;

GO

    @@identity使用注意事项

  我们要慎用@@IDENTITY,原因是 @@IDENTITY 它总是获取最后一条变更数据的自增字段的值,
而忽略了进行变更操作所在的范围约束。比如,我有表 A 和表 B 两个表,现在我在表 A 上定义了一个Insert触发器,当在表 A 中插入一条数据时,自动在表 B 也插入一条数据。此时,大家注意,有两个原子操作:在A中插入一条数据, 接着在B中随后插入一条数据。

  现在我们想下,假设上面表 A 和表 B 都有IDENTITY自增域,那么我们在表 A 插入一条数据后,使用了 SELECT @@IDENTITY 输出时,输出的到底是 A 还是 B 的自增域的值呢? 答案很明显,是谁最后插入就输出谁,那么就是 B 了。于是,我本意是想得到 A 的自增域值,结果得到了 B 的自增域值,一只 BUG 随之诞生,搞不好还会影响到整个系统数据的混乱。

  因此,对于这种情况,建议大家慎用 @@IDENTITY,而尽量采用 SCOPE_IDENTITY() 函数替换之。SCOPE_IDENTITY() 也是得到最后一条自增域的值,但是它是仅限在一个操作范围之内,而不@@IDENTITY 是取全局操作的最后一步操作所产生的自增域的值的。

时间: 2024-08-03 11:32:49

SQL Server 中@@IDENTITY的用法的相关文章

SQL Server 中 RAISERROR 的用法(转)

在存储过程中进程会处理一些逻辑性的错误,如:将RMB转换为USD时,没有查询到想要的汇率 这个时候最好在存储过程中抛个异常,方便自己查找错误信息... 其语法如下: RAISERROR ( { msg_id | msg_str | @local_variable }                    { ,severity ,state }                    [ ,argument [ ,...n ] ]           )          [ WITH optio

SQL Server中@@ROWCOUNT的用法

SQL Server中@@ROWCOUNT返回受上一语句影响的行数,返回值类型为 int 整型. 如果行数大于 20 亿,则需要使用 ROWCOUNT_BIG. @@ROWCOUNT和@@ERROR变量的值,在执行完一条语句后总是会发生变化,所以我们将他们作为判断的依据的时候应该首先保存在局部变量中.他们反映的都是紧接着的上一条语句对他们的影响! 我们通常可以通过update.insert语句并使用@@ROWCOUNT来检测是否更改了任何一些行. 下面介绍一个使用@@ROWCOUNT的实例: S

SQL Server 中 RAISERROR 的用法

raiserror  是由单词 raise error 组成     raise  增加; 提高; 提升 raiserror 的作用: raiserror 是用于抛出一个错误.[ 以下资料来源于sql server 2005的帮助 ] 其语法如下: RAISERROR ( { msg_id | msg_str | @local_variable } { ,severity ,state } [ ,argument [ ,...n ] ] ) [ WITH option [ ,...n ] ] 简

sql server中substring的用法

SQL 中的 substring 函数是用来截取一个栏位资料中的其中一部分. 例如,我们需要将字符串'abdcsef'中的'abd'给提取出来,则可用substring 来实现: select substring('abdcsef',1,3) 结果: 'abd' 括号中数字'1'表示截取的起始位置是从该字符串第一个字符开始,'3'表示截取后得到的字符串长度为3个字符. 这是'substring'最基础的语法,当然,我们的需求有时候会变得比较复杂,例如以下例子: 我们只想要得到'roomno'中的

SQL server 中null的用法

在SQL中我们经常用到null值, 那么什么是NULL?如下是MSDN给出的一段简短描述(见"Null Values"):?A value of NULL indicates that the value is unknown. A value of NULL is different from an empty or zero value. No two null values are equal. Comparisons between two null values, or be

SQL Server中Merge-using的用法

在执行之前: merge into UserInfo u using chartinfo c on u.UserId=c.UserId when matched and u.UserName=c.UserName then update set u.lastUpdate=c.LastUpdate when not matched --为not matched时不能为update(没有匹配成功 当然不能update了) then insert (UserName,Sex)values('Zhang

SQL Server中JOIN的用法

JOIN 分为:内连接(INNER JOIN).外连接(OUTER JOIN).其中,外连接分为:左外连接(LEFT OUTER JOIN).右外连接(RIGHT OUTER JOIN).全外连接(FULL OUTER JOIN),其中外连接的"OUTER"关键字可以省略不写.例: 表A有列ID,值为: 1 2 3 4表B有列ID,值为: 3 4 5 61.内连接(显示左右两表能完全匹配的数据): select A.ID, B.ID from A INNER JOIN B ON A.I

SQL Server中except和intersect用法

except是A集合减去B集合的结果:intersect是A集合和B集合的交集:都是返回的是非重复值,很多属性都和union类似. 还是以student为例 select * from student; select * into student1 from student; go insert into student1 values('aaa',20,'Js'),('bbb',30,'js'),('ccc',40,'sh'); go insert into student1 values('

SQL Server 中关于EXCEPT和INTERSECT的用法

熟练使用SQL Server中的各种用法会给查询带来很多方便.今天就介绍一下EXCEPT和INTERSECT.注意此语法仅在SQL Server 2005及以上版本支持. EXCEPT是指在第一个集合中存在,但是不存在于第二个集合中的数据. INTERSECT是指在两个集合中都存在的数据. 之间的优先级是EXCEPT  低于INTERSECT SQL Server 中关于EXCEPT和INTERSECT的用法,布布扣,bubuko.com