2008-11-19 26 views
4

我以前做像这样一个简单的查询获得在Access中使用下一个自动编号:如何获取SQL 2005和ASP中使用的下一个身份号码?

SELECT RecordNumber, Info FROM myTABLE WHERE 0=1 

这样我可以创建一个变量来保存currentRecord,它会使用该访问打算同自动编号使用时,我更新该行

rs.AddNew 
currentRecord = rs("RecordNumber") 

rsInfo = "SomeFormData" & currentRecord 
rs.Update 
rs.Close 

现在这种使用上的MS Access工作,但在SQL 2005,我没有得到回来的新纪录产生的身份。 “SomeFormData”被正确插入,SQL中的RecordNumber字段被新的自动编号填充,但我的变量中没有RecordNumber,我需要它继续填充相关表单,将数据保存到相关表并且需要保存当前记录号码。

问题是,有没有办法让这个独特的数字回来做一个新的插入?

回答

9

IDENT_CURRENT('tableName')(包括单引号)返回身份对给定表的当前值。该值应该是表中使用的最后分配的标识值。换句话说,除非该行已被删除,否则您将在表中拥有一个具有此标识值的行。将在下一个INSERT上分配的身份值将是IDENT_CURRENT('tableName') + IDENT_INCR('tableName')

虽然我不建议依赖于此。如果以这种方式预先确定下一个标识值,那么最终会出现另一个进程使插入实际上在您的ID之前获得该ID的情况,因此您的进程将使用错误的ID值结束。

最好先插入插入(即使您还没有所有数据),并使用SCOPE_IDENTITY()来获取分配的实际ID。

您可能想知道为什么SCOPE_IDENTITY()IDENT_CURRENT('tableName')更好。顾名思义,前者会给你在当前范围内分配的最近的身份值(你的批次,你的存储过程,不管),而后者会给你任何人在桌上分配的最新身份。即使你可能右后'INSERT称之为IDENT_CURRENT,它仍然有可能是别人的INSERT之间发生的,和IDENT_CURRENT会给你造成的他们插入,而不是你的,而SCOPE_IDENTITY总会给你你的身份价值。

编辑

另外值得一提的是,SCOPE_IDENTITY()是有利的在类似运作@@IDENTITY。尽管两者都返回当前批次中分配的最新标识值,但@@IDENTITY受到触发器内插入的影响; SCOPE_IDENTITY()不是。

+0

谢谢你指出我在正确的方向...... – jesusOmar 2008-11-19 21:32:06

1

SELECT CAST(SCOPE_IDENTITY()AS INT)

相关问题