`
pcajax
  • 浏览: 2108456 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

@@IDENTITY与SCOPE_IDENTITY()

 
阅读更多

@@IDENTITY与SCOPE_IDENTITY()

      在一条 INSERT、SELECT INTO 或大容量复制语句完成后,@@IDENTITY 中包含语句生成的最后一个标识值。如果语句未影响任何包含标识列的表,则 @@IDENTITY 返回 NULL。如果插入了多个行,生成了多个标识值,则 @@IDENTITY 将返回最后生成的标识值。如果语句触发了一个或多个触发器,该触发器又执行了生成标识值的插入操作,那么,在语句执行后立即调用 @@IDENTITY 将返回触发器生成的最后一个标识值。如果对包含标识列的表执行插入操作后触发了触发器,并且触发器对另一个没有标识列的表执行了插入操作,则 @@IDENTITY 将返回第一次插入的标识值。出现 INSERT 或 SELECT INTO 语句失败或大容量复制失败,或者事务被回滚的情况时,@@IDENTITY 值不会恢复为以前的设置。

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

     @@IDENTITY、SCOPE_IDENTITY 和 IDENT_CURRENT 是相似的函数,因为他们都返回插入到表的 IDENTITY 列的最后一个值。

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

     IDENT_CURRENT 不受作用域和会话的限制,而受限于指定的表。IDENT_CURRENT 可以返回任何会话和任何作用域中为特定表生成的标识值。

     @@IDENTITY 函数的作用域是执行该函数的本地服务器上的当前会话。此函数不能应用于远程或链接服务器。若要获得其他服务器上的标识值,请在远程服务器或链接服务器上执行存储过程,并使(在远程或链接服务器的环境中执行的)该存储过程收集标识值,并将其返回本地服务器上的发出调用的连接。

     以下示例向包含标识列 (LocationID) 的表中插入一行,并使用 @@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'52.5GETDATE());
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 它总是获取最后一条变更数据的自增字段的值,
 而忽略了进行变更操作所在的范围约束。比如,我有表 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 是取全局操作的最后一步操作所产生的自增域的值的。
分享到:
评论

相关推荐

    向数据库中插入数据并返回当前插入的行数及全局变量@@IDENTITY应用

    数据库中有张表User,字段是ID和Name,ID自增。 利用存储过程实现插入时返回当前的行数 代码如下: CREATE PROC Proc_Insert... 您可能感兴趣的文章:@@IDENTITY与SCOPE_IDENTITY()sql添加数据后返回受影响行数据sqlse

    sql语句返回主键SCOPE_IDENTITY()

    在sql语句后使用 SCOPE_IDENTITY() 当然您也可以使用 SELECT @@IDENTITY 但是使用 SELECT @@IDENTITY是去全局最新. 有可能取得值不正确. 示例: 代码如下:insert into dbo.SNS_BlogData(userName) values(‘jiangyun...

    identity_cache:ASP.NET身份缓存提供程序

    #Scope该项目的范围是提供基于Cache数据库的ASP.NET Identity。 ASP.NET Identity是用于构建ASP.NET Web应用程序的新成员系统。 ASP.NET Identity允许您向应用程序添加登录功能,并可以轻松自定义有关已登录用户的...

    最新PCSC CCID 测试源码

    = SCARD_SCOPE_USER && dwScope != SCARD_SCOPE_TERMINAL && dwScope != SCARD_SCOPE_SYSTEM && dwScope != SCARD_SCOPE_GLOBAL) { *phContext = 0; return SCARD_E_INVALID_VALUE; } /* * Unique ...

    IdentityScope.rar_objects

    IdentityScope represents a scope for Identity objects.

    Hibernate注释大全收藏

    AUTO 生成器,适用与可移值的应用,多个@Id可以共享同一个 identifier生成器,只要把generator属性设成相同的值就可以。通过@SequenceGenerator 和 @TableGenerator 可以配置不同的 identifier 生成器。 ...

    NIST SP800-76-1_012407.pdf

    FIPS 201 [FIPS], Personal Identity Verification (PIV) for Federal Employees and Contractors, defines procedures for the PIV lifecycle activities including identity proofing, registration, PIV Card ...

    NIST SP800-76-2.pdf

    FIPS 201 [FIPS], Personal Identity Verification (PIV) for Federal Employees and Contractors, defines procedures for the PIV lifecycle activities including identity proofing, registration, PIV Card ...

    elixir-client-demo:一个简单的Elixir客户端演示应用程序

    Elixir客户演示应用 这是一个非常简单的应用程序,可以使用客户端库在Curity Identity Server中测试...=> "dcde70ab-4a0f-43ef-8d98-d7b36d0ed17a", "expires_in" => 300, "scope" => "", "token_type" => "bearer"}

    Theories of Consciousness_ An Introduction and Assessment, 2nd Edition

    The book’s broad scope, depth of coverage and focus on key philosophical positions and arguments make it an indispensable text for those teaching or studying philosophy of mind and psychology....

    Cplusplus.CLI.Primer.For.NET.Development

    Chapter 14: Scope of a Managed Object Chapter 15: Mixed Mode Chapter 16: Equality and Identity Chapter 17: Abstract Classes Chapter 18: Nullptr Chapter 19: Declaring Properties Chapter 20: Strings ...

    authtrail:跟踪Devise登录活动

    AuthTrail 跟踪Devise登录活动 :tangerine: 经过战斗测试 安装 将此行添加到您的应用程序的Gemfile中...identity -电子邮件地址 success -登录是否成功 failure_reason如果登录失败 user -如果登录成功用户 context -

    boot-cljs-test:启动任务以运行ClojureScript测试

    引导任务,使ClojureScript测试变得快速,轻松并且与测试Clojure一致。 [crisptrutski/boot-cljs-test " 0.3.5-SNAPSHOT " ] ; ; latest release 入门 添加到build.boot并确保将测试添加到类路径。 (set-env! :...

    A NEW INTRODUCTION TO MODAL LOGIC

    descriptions C18) Descriptions and scope C23) Individual constants and function symbols C27) Exercises — 17 C28) Notes C29) 18 Intensional Objects 330 Contingent identity C30) Contingent identity ...

    apache security 安全

    Scope Contents of This Book Online Companion Conventions Used in This Book Using Code Examples We'd Like to Hear from You Safari Enabled Acknowledgments Chapter 1. Apache Security ...

    Hibernate_3.2.0_符合Java习惯的关系数据库持久化

    11.1.3. 关注对象标识(Considering object identity) 11.1.4. 常见问题 11.2. 数据库事务声明 11.2.1. 非托管环境 11.2.2. 使用JTA 11.2.3. 异常处理 11.2.4. 事务超时 11.3. 乐观并发控制(Optimistic ...

    Active Directory Cookbook, 3rd Edition.pdf

    Covers how to create groups, modify group scope and type, and manage membership. Chapter 8, Computer Objects Covers creating computers, joining computers to a domain, resetting computers, and locating...

Global site tag (gtag.js) - Google Analytics