【问题标题】:Reset Identity Seed ('DBCC CHECKIDENT ... RESEED' is not working)重置身份种子(“DBCC CHECKIDENT ... RESEED”不起作用)
【发布时间】:2015-02-25 14:59:27
【问题描述】:

对于我的单元测试,我有一个自动化过程,它逐个表地构建数据库的副本。我首先运行 SELECT INTO 并添加主键和任何索引。

我复制的一些带有数据的表,对于那些没有数据的表,我希望重置身份种子。

为了实现这一点,我有以下T-SQL 声明:

EXEC('TRUNCATE TABLE [' + @TableName + '];')
IF EXISTS (SELECT * FROM sys.identity_columns WHERE object_id = OBJECT_ID(@TableName) AND last_value IS NOT NULL)
BEGIN
    EXEC('DBCC CHECKIDENT (' + @TableName + ', reseed, 1)')
END

查询运行时没有报告任何问题,但是当我在设计视图中检查表时,Identity Seed 值永远不会重置。

谁能告诉我为什么没有重置身份种子,或者我还需要做什么?

更新: 根据一些 cmets,我已将 sys.identity_columns 修改为以下内容:

IF EXISTS (SELECT * FROM sys.identity_columns WHERE object_id = OBJECT_ID(@TableName))

运行时,会返回以下消息:

检查身份信息:当前身份值“1”。 DBCC 执行完成。如果 DBCC 打印错误消息,请联系您的系统管理员。

这看起来很有希望。但是,如果我随后刷新表(在对象资源管理器中)并在设计视图中查看它,身份种子不会改变,不是 1(或 0)而是 135。

【问题讨论】:

  • 桌子周围的方块怎么样,就像你在截断中所做的那样?
  • 还要确认它实际上正在到达那个 EXEC。一些调试 cmets 或警报。
  • TRUNCATE TABLE 已经将身份重置为其当前种子值。所以你的last_value IS NOT NULL 条件将不匹配并且CHECKIDENT 永远不会发生(但是,它甚至不应该是必要的......)
  • 如果你只是截断,为什么你需要重新播种? Truncate table 已重置身份。
  • 正如我在之前的评论中试图说的那样,但可能不够清楚 - 在设计视图中查看没有任何信息告诉您下一个插入将使用什么值。它告诉您原始规范是什么。您是否尝试过在此之后实际插入一行并查看生成了什么值?

标签: sql sql-server tsql dbcc


【解决方案1】:

在分配身份密钥时遇到了类似的问题(在我的情况下分配了更大的值)。在我的情况下,我发现如果我在运行 DBCHECKIDENT RESEED 之后运行 DBCC CHECKIDENT (TableName),它会完全“刷新”自身为新值。否则它将卡在较旧的值上。我不知道为什么,但它适用于我的情况(并且可能对其他人有用。)

【讨论】:

  • 这仅在一种情况下对我有用。老实说,这整个重新播种问题看起来像是 MS SQL 中的一个错误。尽可能避免重新播种
  • 这实际上对我有用。不确定它是否是一个实例。我希望它一直有效。谢谢杰夫...!
  • 对我来说,我在运行重新种子后运行 DBCC CHECKIDENT (TableName) 并且遇到了问题。最后,我尝试在重新播种后立即插入一条记录,然后它就起作用了。奇数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-23
  • 1970-01-01
  • 1970-01-01
  • 2010-10-21
  • 2023-04-09
  • 1970-01-01
相关资源
最近更新 更多