是否有tsql查询来告诉它期望用于下一行插入的SQL服务器标识列值?
编辑添加:
我删除并重新创建了一个表
[personID] [int] IDENTITY(1,1) NOT NULL
作为我的CREATE TABLE命令的一部分.我还尝试重新设置标识列,同时删除该表中的所有信息,但这并不总是有效.它让我想知道是否有办法查看SQL预期用于下一个标识列号.
您可能希望使用SCOPE_IDENTITY而非@@ IDENTITY将其限制为当前范围中的标识值.这样可以避免将触发器插入的新标识值放入其他表而不是刚刚插入的表中.
但是你可以计算下一个身份值是什么
SELECT IDENT_CURRENT('mytable') + IDENT_INCR('mytable') FROM mytable
问题是你无法保证价值.您必须有一个锁,以便在运行时在表上拒绝其他插入以确保值准确.在用完32位整数后,我也不知道逻辑是什么.我不知道它是否翻身或失败.
编辑:我刚测试了这个(参见下面的SQL),当没有数据时它没有返回正确的值.并且使用DBCC CHECKIDENT('tablename',RESEED,200)重新种子实际上导致下一个值为201而不是200.
CREATE TABLE willtest (myid integer IDENTITY(1,1), myvalue varchar(255)) SELECT IDENT_CURRENT('willtest') + IDENT_INCR('willtest') INSERT INTO willtest (myvalue) VALUES ('1') INSERT INTO willtest (myvalue) VALUES ('2') INSERT INTO willtest (myvalue) VALUES ('3') INSERT INTO willtest (myvalue) VALUES ('4') INSERT INTO willtest (myvalue) VALUES ('5') INSERT INTO willtest (myvalue) VALUES ('6') INSERT INTO willtest (myvalue) VALUES ('7') INSERT INTO willtest (myvalue) VALUES ('8') SELECT IDENT_CURRENT('willtest') + IDENT_INCR('willtest') DBCC CHECKIDENT ('willtest', RESEED, 200) SELECT IDENT_CURRENT('willtest') + IDENT_INCR('willtest') INSERT INTO willtest (myvalue) VALUES ('200') INSERT INTO willtest (myvalue) VALUES ('201') INSERT INTO willtest (myvalue) VALUES ('202') INSERT INTO willtest (myvalue) VALUES ('203') INSERT INTO willtest (myvalue) VALUES ('204') INSERT INTO willtest (myvalue) VALUES ('205') INSERT INTO willtest (myvalue) VALUES ('206') INSERT INTO willtest (myvalue) VALUES ('207') SELECT IDENT_CURRENT('willtest') + IDENT_INCR('willtest') SELECT * FROM willtest DROP TABLE willtest
不,没有任何保证的方法(虽然你当然可以找出下一个值可能是什么,另一个命令可能会在你可以使用之前使用它).您可以检索的唯一保证值是先前插入的标识值SCOPE_IDENTITY()
(将返回上次为当前范围生成的标识值).
在使用自动递增的种子标识列之前,为什么需要知道该值的目的是值得怀疑的.
如果您之前需要知道该值,那么我建议您自己生成ID.您可以使用在表名上键入的id表来执行此操作,或者,如果您有可伸缩性问题(并且您正在使用事务),则可以为每个需要id的id表创建一个id表,该id将具有要插入的id(然后增加).
或者,您可以使用GUID,并且在将其发送到数据库之前,您可以在客户端轻松生成这些GUID.