我注意到SQL跟踪最新的标识(字段在每次创建新记录时会自动增加)。我想使用C#从表中检索最新的标识。不幸的是,大部分时间表都是空的(一段时间后记录被写入并删除,所以表格常常是空的)。 这是可能在C#SQL API的范围内做到这一点,或者我必须创建一个存储过程来检索这个吗?从空表获取最新标识(如ID)SQL
为了更好地解释。如果上面的行被删除,下一个记录的下一个ID号将是32.我想在写入记录之前检索32,在表空的情况下。
我注意到SQL跟踪最新的标识(字段在每次创建新记录时会自动增加)。我想使用C#从表中检索最新的标识。不幸的是,大部分时间表都是空的(一段时间后记录被写入并删除,所以表格常常是空的)。 这是可能在C#SQL API的范围内做到这一点,或者我必须创建一个存储过程来检索这个吗?从空表获取最新标识(如ID)SQL
为了更好地解释。如果上面的行被删除,下一个记录的下一个ID号将是32.我想在写入记录之前检索32,在表空的情况下。
SELECT IDENT_CURRENT('table_name')+1;
IDENT_CURRENT返回为任何会话和范围的具体 表生成的最后一个标识值。
http://msdn.microsoft.com/en-us/library/ms175098.aspx
然而,尽管这显示下一个ID将是什么,这并不意味着它会自己进入下一个ID。其他人可以在你之前创造新的记录。
总之,没有办法返回你将要插入的东西的价值。
+1因为它回答了这个问题,但你可能想要注意它返回的数字可能不是您要插入的下一行的ID(因为其他人在您之前插入)。 – dasblinkenlight 2012-04-19 14:42:52
@dasblinkenlight好的,更新的答案 – Curt 2012-04-19 14:46:04
这对我需要的东西完美地工作。非常感谢你! – 2012-04-19 14:49:11
这将是下面的查询
DBCC CHECKIDENT( '[表名]',NORESEED)
您应该包含NORESEED参数;否则这也将潜在地改变身份值(在当前身份和最大身份值不同的情况下)。 – MartW 2012-04-19 14:47:43
万一增量不是常规的 “1”:
SELECT IDENT_CURRENT('mytable') + IDENT_INCR('mytable')
当然,所有这些都依赖于一致填充的身份列,即不会搞乱手动插入或重新播种。如果您要直接使用此ID进行插入,Curt已经提到了可能出现的并发问题。
'SELECT LAST_INSERT_ID()+ 1'? – RobertPitt 2012-04-19 14:40:36
如果有两个对下一个ID的调用会发生什么情况,那么分配的下一个ID可能不是您在编写记录时所期望的。 – Zachary 2012-04-19 14:41:00
很多在这篇文章中的好信息:http://stackoverflow.com/questions/567171/scope-identity-vs-ident-current – mgnoonan 2012-04-19 14:43:40