0

データベースをリセットするSQLスクリプトを作成しています。これを行うには、いくつかの(すべてではない)テーブルを空にして、それらのID値を0にリセットします。

一部のテーブルではを使用TRUNCATE TABLEしていますが、テーブルが外部キー制約によって参照されている場合、これは機能しません。それらのテーブルにはを使用しますDBCC CHECKIDENT(TableName, RESEED, 0)。これはほとんどのテーブルで機能しますが、すべてでは機能しません。テーブルにデータがない場合、現在のID値は0ではなくNULLになります。

CREATE TABLE TableName (Id int identity, Value varchar(10))
DBCC CHECKIDENT(TableName)

-- Checking identity information: current identity value 'NULL', current column value 'NULL'.

それらを使用するDBCC CHECKIDENT(TableName, RESEED, 0)と、次のID値として0になります。代わりに1を再シード値として使用できますが、データが含まれているテーブルは2から始まります。

sys-viewのいずれかで次のID値を見つけることは可能ですか?次の値を変数に入れることができれば、それを使用して次の値を0または1に設定できます。試してみましIDENT_CURRENT('TableName')たが、次の値としてNULLと0の両方に対して1と表示されます。

また、「なぜすべてを1から始める必要があるのか​​」などの質問や、私が求めているものとは別の結果を示唆する質問は避けてください。

4

3 に答える 3

5

すべてのテーブルにIDフィールドがある場合に使用します。

exec sp_MSforeachtable @command1 = 'DBCC CHECKIDENT(''?'', RESEED, 1)'

MSforeachtableは文書化されていませんが、データベース内のすべてのテーブルに対して特定のコマンドを実行する非常に便利なストアドプロシージャです。

ID列を持つテーブルのみを再シードするには、次のスクリプトを使用できます。またsp_MSforeachtable、正しいテーブルを利用しますが、考慮に入れます。

EXEC sp_MSforeachtable '
IF (SELECT COUNT(1) 
    FROM INFORMATION_SCHEMA.TABLES 
    WHERE TABLE_TYPE = ''BASE TABLE'' 
    AND ''[''+ TABLE_SCHEMA + ''].['' + TABLE_NAME + '']'' = ''?'' 
    AND OBJECTPROPERTY(OBJECT_ID(TABLE_NAME), ''TableHasIdentity'') = 1) > 0 
BEGIN
    DBCC CHECKIDENT (''?'', RESEED, 1)
END'

次のクエリを使用して、データベースのテーブルに挿入された最後のID値を取得します。

   SELECT TableName = OBJECT_NAME(OBJECT_ID) ,
       ColumnName = name ,
       OriginalSeed = seed_value ,
       Step = increment_value ,
       LastValue = last_value ,
       IsNotForReplication = is_not_for_replication
FROM sys.identity_columns

詳細はこちらをご覧ください

于 2012-05-22T08:54:29.203 に答える
0

明確にするために、基本的にすべての将来の挿入を開始し1ますか?

私はこの特定のテーマに関するMS-SQLの専門家ではありませんが、テーブルを切り捨てて、提案したようにIDをリセットし、IDがNULLの場合は、1つのレコード(取得する必要があります0)を挿入してから削除できますか?それでは、次に作成するレコードを残しません1か?

于 2012-05-22T08:54:56.943 に答える
0

最初に制約を無効にします。

ALTER TABLE foo NOCHECK CONSTRAINT CK_foo_column 

また

ALTER TABLE foo NOCHECK CONSTRAINT ALL

次に、テーブルを切り捨てます

于 2014-12-27T00:35:46.527 に答える