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)函数和去除触发器。

时间: 2024-09-24 08:11:41

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

python抓取最新博客内容并生成Rss

  本文给大家分享的是使用python抓取最新博客内容并生成Rss的代码,主要用到了PyRSS2Gen方法,非常的简单实用,有需要的小伙伴可以参考下. osc的rss不是全文输出的,不开心,所以就有了python抓取osc最新博客生成Rss ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 4

SQL插入数据时返回最新ID方法

SQL插入数据时返回最新ID方法 SELECT LAST_INSERT_ID().SELECT @@IDENTITY接可.但到下午那兄弟还没搞定.因为不知道怎么运行..项目都是三层的.基本是写在DBHELPER中.原因是其写入了: cmd.ExecuteNonQuery(); ---这是执行非查询语句返回受影响的行数. 其实是应该写入: cmd.ExecuteScalar(); 返回首行首列.可能是因为helper里面注释为:        /// <summary>         ///

ASP通过@@identity取得最新添加记录的ID值

set rs=server.createobject("adodb.recordset")sql="select * from table"rs.open sql,conn,1,3rs.addnewrs("abc1")=abc1rs("abc2")=abc2rs.updaters.closers.open "select @@identity",conn,1,1Response.Write rs(0)rs.

sql实现每个分类取最新几条语句

在sql使用中,我们可能经常会碰到这样的需求,即每类信息取前几条显示出来. 实现的方法有很多种,但考虑到效率问题.今天我们使用sql server2005里row_number()这个函数. ROW_NUMBER ( ) 函数的语法如下: ROW_NUMBER ( ) OVER ( [ ] ) OVER 子句中的 PARTITION BY 将结果集分为多个分区. OVER 子句中的 ORDER BY 将对 ROW_NUMBER 进行排序. 假如要从article表中得到每个分类的10条数据,并且

sqlserver中排序取数据的问题

  sqlserver中关于排序取数据的问题 SELECT * FROM (SELECT *,row_number() OVER (PARTITION BY wok.flag_3 ORDER BY wok.createtime desc) rownum FROM (select workh.corp_code,workh.corp_name,workh.begin_date, workh.createtime, workh.flag_1,workh.flag_2,workb.main_id,wo

每个分类取最新的几条的SQL实现代码_MsSql

CREATE TABLE table1( [ID] [bigint] IDENTITY(1,1) NOT NULL, [Name] [nvarchar](128) NOT NULL, [class] int not null, [date] datetime not null)class 表示分类编号. 分类数不固定, 至少有上千种分类 date 表示该条记录被更新的时间 我们现在想获得每个分类最新被更新的5条记录. 解决方案 select id,name,class,date from(sel

asp如何取得插入记录后最新ID的值?

ACCESS库可以这样书写:set rs = server.createobject("adodb.recordset")sql = "select * from news"rs.addnewrs("title") = "测试"rs("content") = "内容"rs.updatenewid = rs("id")rs.close SQLSERVER用上面的方法不行

ASP.NET中用js取CheckBoxList中值的方法实例

用脚本取CheckBoxList中的值,并用"|"将其分开,之后将取到的值放入文本框,返回数据库做添加或者修改   做的一些项目都比较小,而且时间紧,有好多东西都没来得急总结,趁这会还有点时间把前面项目中的用到的知识点分享下,只为以后方便使用. 前台页面代码 复制代码 代码如下: <!--关键字-->     <div id="keyWordsDiv" style="border: 2px solid #6FA1D9; display:

js采用map取到id集合组并且实现点击一行选中一行_javascript技巧

复制代码 代码如下: <tbody > <tr > <td >1</td> <td>楼盘开业<br>折扣大大</td> <td>2011-11-11</td> <td>短信通知</td> </tr> <tr > <td>2</td> <td>楼盘开业<br>折扣大大</td> <td&g