SqlServer中用@@IDENTITY取最新ID不准的问题

最近遇到了一个SqlServer中用@@IDENTITY取最新ID不准的问题,经过在网上的一番查找,找到了如下资料,略作记录:
"一个网友问我一个关于@@IDENTITY的问题。他的数据库中有一个存储过程,有 insert语句,然后马上就用SELECT @@IDENTITY取刚插入的ID值,通常这是没有问题的,但是问题是ID实际上已经达到了100多万了,而 SELECT @@IDENTITY  返回的只有很小的值(才30多),令人费解。

我开始也不太明白,问他先别管@@IDENTITY,新插入记录,ID是多少。他说ID是100多万那么大的数。不是才几十那么小。我帮他分析可能性,是不是identity到了最大限,且identity最大是2的64次方。他说int  最大值是 2,147,483,647,他的ID离溢出还早呢, 但是 return @@IDENTITY 就是 很小的值(只有几十)。我然后又帮他分析道,是不是ID的值被重置过?他说不是,他说现在新插入的 id 就是 170多万。说到这里,我了解了一点了。我建议他用scope_identity(table_name)函数来取指定表的IDENTITY。我们以前有过经验,@@IDENTITY和IDENTITY_CURRENT()都不是很理想,因为它们会受当前表的范围影响。通常有触发器就会引起@@IDENTITY不能正确地取值,IDENTITY_CURRENT()也是如此。幸好有scope_identity(table_name)函数。在这种情况下就只能用这个。这时他才想起来,他的表有触发器。呵呵,迟了点。我建议他最好不要用触发器。能避免就避免。他说这个触发器是可以用别的方式代替的。他会试一下用scope_identity(table_name)函数和去除触发器。"

资料来源:http://www.cnblogs.com/mikelij/archive/2010/05/31/1779895.html
————————————————
版权声明:本文为CSDN博主「fend0875」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/fend0875/article/details/73294590

原文地址:https://www.cnblogs.com/nnnnnn/p/12002684.html

时间: 2024-10-13 23:22:02

SqlServer中用@@IDENTITY取最新ID不准的问题的相关文章

关于各种数据库 Insert时同时取到Id的操作

对数据库的操作,在Insert的同时获取到Id,保证原子性操作.而不是,先取Id,然后再插入到数据库等操作. Oracle: 使用Oracle自带的 Returning into 语句,具体代码示例如下: 1 sql = @"INSERT INTO KEYWORD(KEYWORD_ID,SITE_ID,KEYWORD_NAME,STATUS,SOURCE,CREATE_TIME,LAST_CHANGED) 2 VALUES 3 ( 4 KEYWORD_SEQ.nextVal, 5 :SITE_I

SQLserver中用convert函数转换日期格式

SQLserver中用convert函数转换日期格式2008-01-15 15:51SQLserver中用convert函数转换日期格式 SQL Server中文版的默认的日期字段datetime格式是yyyy-mm-dd Thh:mm:ss.mmm 例如: select getdate() 2004-09-12 11:06:08.177 整理了一下SQL Server里面可能经常会用到的日期格式转换方法: 举例如下: select CONVERT(varchar, getdate(), 120

sqlserver 必须声明标量变量 "@id" 什么原因,如何解决 存储过程 带参数

sqlserver 必须声明标量变量 "@id". 原因 set @sql = 'insert into stu(id,name) select top @id from stus'  // 错误 解决办法 set @sql = 'insert into stu(id,name) select top '+CONVERT(char(3),@id) +'from stus'  //正确

用DataReader在comboBox中显示name,取值id:

定义ItemObject类 classItemObject { public int id; public string name; publicItemObject(int id,string name) { this.id=id; this.name =name; } public override string ToString() { return name; } } 1.实例化对象,加载数据 ItemObject[] io = new ItemObject[3];          

SpringBoot项目执行脚本, 自动拉取最新代码并重启

gitPullThenRestart.sh # 日期: 20191230 # 作者: 何鹏举 # 说明: 项目部署在阿里云上, 每次编译打包上传比较麻烦, 因此编写此脚本, 用于应用内可以点击按钮进行自动重启. # 备注: 1) 阿里云的插件也是需要每次上传到OSS再启动, 上传的jar包比较大(大部分是第三方依赖), 感觉不好 # 2) 使用jenkins, 就一个项目再去搭建一套jenkins, 必要性也不是很大 # 以下代码中 /root/hekele 为git clone的项目路径, /

git从gitlab拉取最新的亚博代码到本地体育文件夹

git从gitlab拉取最新的亚博代码到本地体育文件夹:1.Git下载地址 2.安装Git? 3.从管理员手中拿到用户名.邮箱.密码 假设用户名为: itcats_cn 邮箱为[email protected] 密码为12345678 4.初始化git信息(在右键Git Bash输入以下命令) (1) git config --global user.name 'itcats_cn'(2) git config --global user.email '[email protected]'(3)

SQLServer获取最后插入的ID值SCOPE_IDENTITY、IDENT_CURRENT 和 @@IDENTITY的比较

IDENT_CURRENT 返回为任何会话和任何作用域中的特定表最后生成的标识值.IDENT_CURRENT 不受作用域和会话的限制,而受限于指定的表. @@IDENTITY 返回为当前会话的所有作用域中的任何表最后生成的标识值. SCOPE_IDENTITY 返回为当前会话和当前作用域中的任何表最后生成的标识值 也许大家对SQL Server中的 @@IDENTITY 都不陌生,都知道它是获取数据表中最后一条插入数据的IDENTITY值.比如,表 A 中有个 ID 为自增1的字段,假设此时 I

sql 分组取最新的数据sqlserver巧用row_number和partition by分组取top数据

SQL Server 2005后之后,引入了row_number()函数,row_number()函数的分组排序功能使这种操作变得非常简单 分组取TOP数据是T-SQL中的常用查询, 如学生信息管理系统中取出每个学科前3名的学生.这种查询在SQL Server 2005之前,写起来很繁琐,需要用到临时表关联查询才能取到.SQL Server 2005后之后,引入了row_number()函数,row_number()函数的分组排序功能使这种操作变得非常简单.下面是一个简单示例: --1.创建测试

delphi 并发取数据库id问题

这段时间有个项目id频繁出现 id冲突的问题 一真找不到原因 后来想到了个办法 在新建取id时先把到到的id保存起来 上代码 望大神指点下 /// <summary>/// 到表中的最大id/// </summary>/// <param name="fld">字段名--必须是int型</param>/// <param name="tbl">表名</param>/// <param na