I’m building a SQL script to reset a database. To do this I want to empty several (not all) tables and reset their identity values to 0.
For some tables I use TRUNCATE TABLE, but this does not work when the table has is referenced by a foreign key constraint. For those tables I use DBCC CHECKIDENT(TableName, RESEED, 0). This works for most tables, but not for all. If a table never had any data, the current identity value is NULL instead of 0:
CREATE TABLE TableName (Id int identity, Value varchar(10))
DBCC CHECKIDENT(TableName)
-- Checking identity information: current identity value 'NULL', current column value 'NULL'.
If I use DBCC CHECKIDENT(TableName, RESEED, 0) on them, they will have 0 as next identity value. I can instead use 1 as reseed value, but then the tables which have had data in them will start on 2.
Is it possible to find the next identity value in any of the sys-views? If I just could get next value into a variable, I could use it to set next value to either 0 or 1. I’ve tried with IDENT_CURRENT('TableName') but it says 1 for both NULL and 0 as next value.
And please, I don’t want any questions like “why do you need all of them to start from 1” or any other question suggesting another result than the one I’m asking for.
Use if all tables have identity field.
MSforeachtableis an undocumented, but extremely handy stored proc which executes a given command against all tables in your database.To reseed ONLY tables with an identity column you can use the next script.
It also makes use of
sp_MSforeachtablebut taking into account the correct tables.Use Following query to get Last Identity value inserted in tables in a database.
Refer this for more details