对有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')方式

时间: 2024-11-06 07:33:31

对有insert触发器表取IDENTITY值时发现的问题的相关文章

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

问题是这样的: T1表上有一个INSERT的触发器,在插入数据的时候,会自动往T2表里面插一条记录 这样当我在T1表上插入新的数据时,取@@IDENTITY的时候,返回的id值是T2表里面的新记录的值 赶快查了下msdn,原来@@IDENTITY还有这么多讲究: 在一条 INSERT.SELECT INTO 或大容量复制语句完成后,@@IDENTITY 中包含语句生成的最后一个标识值.如果语句未影响任何包含标识列的表,则 @@IDENTITY 返回 NULL.如果插入了多个行,生成了多个标识值,

sql insert 触发器-sql server insert 触发器

问题描述 sql server insert 触发器 一张考勤表A,要求:当A表中有新数据插入时,要执行条件(即:SerialNumber等于RecTime按降序排列的序号,根据EmpID相同并且RecDate相同,SerialNumber就重新从1开始),求得SerialNumber的值并填充数据. http://zhidao.baidu.com/question/1882118898301616388.html?quesup2&oldq=1&sort=6

easyui-easyUI datagrid checkbox无法取到值

问题描述 easyUI datagrid checkbox无法取到值 $('#dg').datagrid({ url:'' pagination:true toolbar:'#tb' pageSize: 30 striped: true checkOnSelect: true singleSelect:false rownumbers:false columns:[ [ {field:'id'align:'center'checkbox:'true'formatter:function(vo){

如何用最简单的语句提交大量表单对象的值存储到数据库

如何用最简单的语句提交大量表单对象的值存储到数据库?说道这个问题可能大家经常遇到,感到很头痛,但是又没办法,只能慢慢写,笔者以提交一张应聘表单的提交为例给大家介绍如何用最简短的语句来达到目的脚本运行通过环境环境:iis5.0+sqlserver2000(当然也可以access2000等)如有任何问题或建议请发email:chenxingbai@21cn.com生成表结构的脚本if exists (select * from dbo.sysobjects where id = object_id(

C++函数参数取默认值的深入详解_C 语言

一般情况下,在函数调用时形参从实参那里取得值,因此实参的个数应与形参相同.有时多次调用同一函数时用同样的实参,C++提供简单的处理办法,给形参一个默认值,这样形参就不必一定要从实参取值了.如有一函数声明float area(float r=6.5);指定r的默认值为6.5,如果在调用此函数时,确认r的值为6.5,则可以不必给出实参的值,如area( );  //相当于area(6.5);如果不想使形参取此默认值,则通过实参另行给出.如area(7.5); //形参得到的值为7.5,而不是6.5这

[20171227]表的FULL_HASH_VALUE值的计算.txt

[20171227]表的FULL_HASH_VALUE值的计算.txt --//sql_id的计算是使用MD5算法进行哈希,生成一个128位的Hash Value,其中低32位作为HASH VALUE显示,SQL_ID则取了后64位. --//实际上sql_id使用32进制表示,hash_value使用10进制表示. --//我在链接提到http://blog.itpub.net/267265/viewspace-2142512/内容: --//如果使用md5sum计算的结果,按照4位一组,大小

ASP.NET中实现Form表单字段值自动填充到操作模型中

  这篇文章主要介绍了ASP.NET中实现Form表单字段值自动填充到操作模型中,本文模仿MVC模式中的自动映射表单了模型,使用泛型和反射实现,需要的朋友可以参考下 我们知道ASP.NET MVC有个强大的地方就是Form表单提交到action的时候,可以直接将Form的参数直接装配到action的参数实体对象中 比如 代码如下: action方法 Register(UserModel userModel) { ............................. } 在提交表单的时候,会

JS取request值以及自动执行使用示例

 在网页中JS函数自动执行常用三种方法,下面为大家详细介绍下JS取request值以及自动执行使用,需要的朋友可以参考下 在网页中JS函数自动执行常用三种方法  在HTML中的Head区域中,有如下函数:  代码如下: <SCRIPT LANGUAGE="JavaScript">  functionn MyAutoRun()  {  //以下是您的函数的代码,请自行修改先!  alert("函数自动执行哦!");  }  </SCRIPT> 

hql-HQL语句取值时,有的值没取出来

问题描述 HQL语句取值时,有的值没取出来 如图:count值没取出来 hql语句如下:String queryString = ""from InfoHotWord as infoHotWord "" + ""where infoHotWord.word ='""+word+""'""; 解决方案 没听懂,你倒是把查询结果贴出来啊 解决方案二: 你把hql语句转成sql语句在数据库运行