【发布时间】: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