【问题标题】:Is there a way to store the value of DBCC CheckIdent into a variable?有没有办法将 DBCC CheckIdent 的值存储到变量中?
【发布时间】:2013-03-29 21:03:15
【问题描述】:

我正在尝试做这样的事情:

declare @myCurrentSeedValue int;
select @myCurrentSeedValue = DBCC CheckIdent('MyTable', NORESEED);

这显然是不正确的语法。有人对我如何做到这一点有任何建议吗?

我知道我可以这样做:

select @myCurrentSeedValue = IDENT_SEED('MyTable');

但问题在于每个 MSDN 上的 IDENT_SEED 函数:

使用 DBCC CHECKIDENT 更改标识列的当前值不会更改此函数返回的值。

这可能会有问题,因为我们有其他存储过程会调用 DBCC CHECKIDENT 并重新设置标识列的种子,所以我实际上需要当前种子而不是原始种子。

【问题讨论】:

  • 在标识列上选择最大值?
  • @Blam 这样做我担心如果在我选择列上的 MAX 之前删除了一条记录,我将无法获得真正的当前种子值。但是,既然我重新考虑了这个选项,我想重新设定这个值是可以的,因为数据库中不再存在记录。我倾向于这是我的解决方案。让我尝试一下,如果它有效,我会将其标记为解决方案。

标签: sql tsql stored-procedures syntax


【解决方案1】:

使用Ident_current可以获取表的当前标识,无论哪个进程更新表标识。它适用于任何会话,任何范围。


declare @myCurrentSeedValue int;
select @myCurrentSeedValue = IDENT_CURRENT( 'MyTable' )
select @myCurrentSeedValue

【讨论】:

  • 我非常喜欢这个解决方案。感谢您的帮助。
【解决方案2】:

IDENT_CURRENT 不会返回与DBCC CHECKIDENT 显示的值相同的值,如果表根本没有被填充。

对于刚刚创建的表 DBCC CHECKIDENT('NewTable', NORESEED) 输出当前标识为 NULL(即从未分配过):

检查身份信息:当前身份值'NULL',当前 列值“NULL”。

但是,IDENT_CURRENT('NewTable') 返回1。哪个是正确的according to specs:

当 IDENT_CURRENT 值为 NULL 时(因为表从来没有 包含行或已被截断),IDENT_CURRENT 函数 返回种子值。

当表中只有一行时,返回相同的值1IDENT_CURRENT

要获得当前身份的正确值,您可以直接从sys.identity_columns 表中获取此信息:

SELECT last_value
FROM sys.identity_columns
WHERE object_id = OBJECT_ID('NewTable')

PS:不确定这种方法是否适用于表大量更新的生产数据库,但对于单元测试,它非常适合。我使用此脚本来确定在清理该表时应该为该表设置的新种子值。因为对于从不填充的表,新的种子值必须为 1,否则为 0。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 2010-10-21
    相关资源
    最近更新 更多