对有insert触发器表取IDENTITY值时发现的问题

波斯菊丶

波斯菊丶

2016-02-19 09:22

今天图老师小编给大家介绍下对有insert触发器表取IDENTITY值时发现的问题,平时喜欢对有insert触发器表取IDENTITY值时发现的问题的朋友赶紧收藏起来吧!记得点赞哦~
问题是这样的:
T1表上有一个INSERT的触发器,在插入数据的时候,会自动往T2表里面插一条记录
这样当我在T1表上插入新的数据时,取@@IDENTITY的时候,返回的id值是T2表里面的新记录的值

赶快查了下msdn,原来@@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 函数的作用域是执行该函数的本地服务器上的当前会话。此函数不能应用于远程或链接服务器。若要获得其他服务器上的标识值,请在远程服务器或链接服务器上执行存储过程,并使(在远程或链接服务器的环境中执行的)该存储过程收集标识值,并将其返回本地服务器上的发出调用的连接。


所以对多个表进行操作的时候,最好用
SELECT SCOPE_IDENTITY()和SELECT IDENT_CURRENT(‘T1')方式
展开更多 50%)
分享

猜你喜欢

对有insert触发器表取IDENTITY值时发现的问题

编程语言 网络编程
对有insert触发器表取IDENTITY值时发现的问题

MySQL 5.0 触发器

MySQL mysql数据库
MySQL 5.0 触发器

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

SQLCLR(三)触发器

编程语言 网络编程
SQLCLR(三)触发器

深入了解触发器

电脑入门
深入了解触发器

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

oracle 触发器 学习笔记

编程语言 网络编程
oracle 触发器 学习笔记

触发器基础知识

电脑入门
触发器基础知识

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

使用SQLSERVER 2005/2008 递归CTE查询树型结构的方法

使用SQLSERVER 2005/2008 递归CTE查询树型结构的方法

java中子类继承父类,程序运行顺序的深入分析

java中子类继承父类,程序运行顺序的深入分析
下拉加载更多内容 ↓