DBCC CHECKIDENT RESEED - 需要新值吗?

Jor*_*ter 7 sql-server auto-increment sql-server-2008

我读到的有关重新种植的所有文件都表明了以下内容:

  1. SET @maxIdentityValue = (SELECT MAX(id) FROM tablename)
  2. DBCC CHECKIDENT('tablename', RESEED, @maxIdentityValue)

尚未在我看来,一个简单的DBCC CHECKIDENT('tablename', RESEED)是所有的需要,它会自动确定从表中的正确标识值,而无需提供一个最大值.

是否有理由(性能或其他方面)MAX首先使用首先提取值?

背驮式问题:我需要重新设置的原因是因为我每次数据库复制运行时都使用复制和身份设置为Null.我究竟做错了什么?如何为每个表维护正确的标识种子?

更新(当前解决方案)

现在我没有使用最大值.这是我正在使用的存储过程(我使用查询生成它sys.columns然后只是将每个切割并粘贴到一个新的查询窗口.Messier,更慢,更不优雅,但我不是很熟悉存储过程而且'不'我想使用动态SQL查询):

declare @seedval integer
declare @maxval integer
declare @newval integer
set @seedval = (select ident_current('mytable'));
set @maxval = (select MAX(id) from mytable);
if @maxval > @seedval or @seedval is NULL
BEGIN
    print 'Need to reseed: max is '  + cast(@maxval as varchar) + ' and seed is ' + cast(@seedval as varchar) 
    dbcc checkident('mytable', RESEED);
    set @newval = (select ident_current('mytable'));
    print 'Max is ' + cast(@maxval as varchar) + ' and seed is ' + cast(@newval as varchar) 
END 
ELSE
    print 'No need to reseed'; 
Run Code Online (Sandbox Code Playgroud)

moh*_*has 9

正如在MSDN中所述,仅仅使用它就足够了:

 DBCC CHECKIDENT('tablename', RESEED)  
Run Code Online (Sandbox Code Playgroud)

大部分时间,但是这两个条件不起作用:

  • 当前标识值大于表中的最大值.
  • 从表中删除所有行.

你必须按照你提到的方式去选择(选择max(id)和其余的),所以为什么要在第一时间打扰?:)