再シードについて読んだすべてのドキュメントは、次のようなことを示唆しています。
SET @maxIdentityValue = (SELECT MAX(id) FROM tablename)
- 走る
DBCC CHECKIDENT('tablename', RESEED, @maxIdentityValue)
それでも、必要なのは単純なDBCC CHECKIDENT('tablename', RESEED)
ものだけであり、最大値を指定しなくても、テーブルから正しいID値を自動的に判別するように見えます。
最初に値を抽出することMAX
が好ましい理由(パフォーマンスまたはその他)はありますか?
ピギーバックの質問:再シードが必要な理由は、レプリケーションを使用していて、データベースレプリケーションが実行されるたびにIDがNullに設定され続けるためです。私は何が間違っているのですか?各テーブルの正しいIDシードを維持するにはどうすればよいですか?
更新(現在のソリューション)
今のところ、最大値は使用していません。これは私が使用しているストアドプロシージャです(クエリを使用して生成し、sys.columns
それぞれを新しいクエリウィンドウに切り取って貼り付けるだけです。混乱し、遅く、エレガントではありませんが、ストアドプロシージャに精通していないため、動的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';