2012-04-19 44 views
2

我注意到SQL跟踪最新的标识(字段在每次创建新记录时会自动增加)。我想使用C#从表中检索最新的标识。不幸的是,大部分时间表都是空的(一段时间后记录被写入并删除,所以表格常常是空的)。 这是可能在C#SQL API的范围内做到这一点,或者我必须创建一个存储过程来检索这个吗?从空表获取最新标识(如ID)SQL

enter image description here

为了更好地解释。如果上面的行被删除,下一个记录的下一个ID号将是32.我想在写入记录之前检索32,在表空的情况下。

+0

'SELECT LAST_INSERT_ID()+ 1'? – RobertPitt 2012-04-19 14:40:36

+0

如果有两个对下一个ID的调用会发生什么情况,那么分配的下一个ID可能不是您在编写记录时所期望的。 – Zachary 2012-04-19 14:41:00

+0

很多在这篇文章中的好信息:http://stackoverflow.com/questions/567171/scope-identity-vs-ident-current – mgnoonan 2012-04-19 14:43:40

回答

4
SELECT IDENT_CURRENT('table_name')+1; 

IDENT_CURRENT返回为任何会话和范围的具体 表生成的最后一个标识值。

http://msdn.microsoft.com/en-us/library/ms175098.aspx


然而,尽管这显示下一个ID将是什么,这并不意味着它会自己进入下一个ID。其他人可以在你之前创造新的记录。

总之,没有办法返回你将要插入的东西的价值。

+0

+1因为它回答了这个问题,但你可能想要注意它返回的数字可能不是您要插入的下一行的ID(因为其他人在您之前插入)。 – dasblinkenlight 2012-04-19 14:42:52

+0

@dasblinkenlight好的,更新的答案 – Curt 2012-04-19 14:46:04

+0

这对我需要的东西完美地工作。非常感谢你! – 2012-04-19 14:49:11

0

这将是下面的查询

DBCC CHECKIDENT( '[表名]',NORESEED)

+0

您应该包含NORESEED参数;否则这也将潜在地改变身份值(在当前身份和最大身份值不同的情况下)。 – MartW 2012-04-19 14:47:43

0

万一增量不是常规的 “1”:

SELECT IDENT_CURRENT('mytable') + IDENT_INCR('mytable') 

当然,所有这些都依赖于一致填充的身份列,即不会搞乱手动插入或重新播种。如果您要直接使用此ID进行插入,Curt已经提到了可能出现的并发问题。