我阅读的所有关于重新播种的文档都暗示了以下内容:
SET @maxIdentityValue = (SELECT MAX(id) FROM tablename)
- 跑
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';