有没有办法将DBCC CheckIdent的值存储到变量中?

时间:2013-03-29 21:03:15

标签: sql tsql stored-procedures syntax

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

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

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

我知道我可以这样做:

select @myCurrentSeedValue = IDENT_SEED('MyTable');

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

  

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

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

2 个答案:

答案 0 :(得分:9)

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


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

答案 1 :(得分:0)

如果根本没有填充表,

IDENT_CURRENT 不会返回与 DBCC CHECKIDENT 显示的相同的值。

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

<块引用>

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

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

<块引用>

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

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

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

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

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