Pet*_*erg 0 t-sql identity sql-server-2008-r2
我正在构建一个SQL脚本来重置数据库.为此,我想清空几个(不是所有)表并将其标识值重置为0.
对于我使用的一些表TRUNCATE TABLE,但是当外表键引用表时,这不起作用.对于我使用的那些表DBCC CHECKIDENT(TableName, RESEED, 0).这适用于大多数表,但并非适用于所有表.如果表从未有任何数据,则当前标识值为NULL而不是0:
CREATE TABLE TableName (Id int identity, Value varchar(10))
DBCC CHECKIDENT(TableName)
-- Checking identity information: current identity value 'NULL', current column value 'NULL'.
Run Code Online (Sandbox Code Playgroud)
如果我使用DBCC CHECKIDENT(TableName, RESEED, 0)它们,它们将具有0作为下一个标识值.我可以改为使用1作为重新设定的值,但是其中包含数据的表将从2开始.
是否可以在任何sys视图中找到下一个标识值?如果我只是可以将下一个值转换为变量,我可以使用它将下一个值设置为0或1.我已经尝试过,IDENT_CURRENT('TableName')但是对于NULL和0都表示1为下一个值.
并且,我不想要任何问题,例如"为什么你需要所有这些从1开始"或任何其他问题表明另一个结果而不是我要求的结果.
如果所有表都有标识字段,请使用
exec sp_MSforeachtable @command1 = 'DBCC CHECKIDENT(''?'', RESEED, 1)'
Run Code Online (Sandbox Code Playgroud)
MSforeachtable 是一个未记录但非常方便的存储过程,它对数据库中的所有表执行给定命令.
要仅使用标识列重新设置表,可以使用下一个脚本.它也使用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'
Run Code Online (Sandbox Code Playgroud)
使用以下查询可以在数据库的表中插入Last Identity值.
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
Run Code Online (Sandbox Code Playgroud)