【问题标题】:Reset AutoIncrement for all tables not starting with "_"为所有不以“_”开头的表重置自动增量
【发布时间】:2015-09-10 14:08:19
【问题描述】:

我需要将数据库中的表的 AutoIncrement 字段重置为 1。我发现这可以使用以下方法对单个表完成:

DBCC CHECKIDENT (mytable, RESEED, 0)

我怎样才能对除了名称以“_”开头的表之外的所有表运行此操作?

【问题讨论】:

  • 这似乎是一件相当冒险的事情。你真的确定要为每张桌子重新播种吗?
  • 是的,是用来建模的

标签: sql sql-server auto-increment


【解决方案1】:

我正在使用下一个脚本来执行此操作。可能使用cursor 性能不是很好,但也不会花费太多时间。

declare @TableName varchar(100)

declare cur_Cursor CURSOR STATIC
FOR 

  select  TABLE_NAME 
  from    information_schema.tables
  where   TABLE_TYPE = 'BASE TABLE'
    and   OBJECTPROPERTY(OBJECT_ID(TABLE_NAME), 'TableHasIdentity') = 1

OPEN  cur_Cursor
FETCH NEXT FROM cur_Cursor into @TableName
WHILE @@FETCH_STATUS = 0
BEGIN

  IF LEFT(@TableName, 1) != '_'
    DBCC CHECKIDENT(@TableName, RESEED, 0)

  FETCH NEXT FROM cur_Cursor into @TableName

END
CLOSE cur_Cursor
DEALLOCATE cur_Cursor

【讨论】:

  • 当它找到一个没有标识的表时,这将不起作用。
  • 我所有的表都有身份。数据库规范化
  • @Akkumma 哎哟。它们也是所有聚集索引吗?只是我的 2 美分,但这不是一个好的设计决定。仅仅因为他们现在这样做并不(希望不会)意味着他们将来都会有一个身份。
  • @SeanLange 是的,你是对的。谢谢。我已经编辑了答案
【解决方案2】:

你可以这样试试:

SELECT 
    IDENT_SEED(TABLE_NAME) AS Seed,
    IDENT_INCR(TABLE_NAME) AS Increment,
    IDENT_CURRENT(TABLE_NAME) AS Current_Identity,
    TABLE_NAME,
    'DBCC CHECKIDENT(' + TABLE_NAME + ', RESEED, ' + CAST(IDENT_SEED(TABLE_NAME) AS VARCHAR(10)) + ')'
FROM 
    INFORMATION_SCHEMA.TABLES
WHERE 
    OBJECTPROPERTY(OBJECT_ID(TABLE_NAME), 'TableHasIdentity') = 1
    AND TABLE_TYPE = 'BASE TABLE'
    AND TABLE_NAME not like '_%'

【讨论】:

    【解决方案3】:

    这将为您提供所需的所有 SQL 查询:

    Select 'DBCC CHECKIDENT '+quotename(OBJECT_NAME(OBJECT_ID))+', RESEED, 0); ' From sys.columns Where is_identity = 1
        and left(OBJECT_NAME(OBJECT_ID), 1) <> '_'
    

    您可以复制/粘贴它并执行它或将其包装到光标中。

    【讨论】:

    • 感谢和抱歉,但我不知道如何处理结果
    • 问题是您的查询并不完全准确。您可能会在过程和/或函数中使用具有标识的表变量得到一些误报。
    猜你喜欢
    • 2020-05-10
    • 2016-03-13
    • 2023-03-04
    • 2015-02-09
    • 1970-01-01
    • 2017-01-02
    • 2016-08-10
    • 1970-01-01
    • 2019-05-11
    相关资源
    最近更新 更多