IDENT_CURRENT内幕

IDENT_CURRENT内幕


这个标题有点唬人:)。


IDENT_CURRENT函数可以取出表中标志列的当前值(SQL SERVER规定每个表只能有一个标识列)。关于IDENT_CURRENT、@@IDENTITY和SCOPE_IDENTITY()的区别可以查看我以前的博文 。

@@IDENTITY和SCOPE_IDENTITY是记录会话期间的标识值,是动态的;IDENT_CURRENT是表的当前标志值,是需要物理保存的。那么SQL SERVER到底将IDENT_CURRENT保存在什么地方呢?

在SQL SERVER2005中有一个系统基表sys.syscolpars(其ID为41),表、视图或表值函数的每个列在该基表中有对应的一行,过程或函数的每个参数也存在对应的行。该基表的定义如下:

IDENT_CURRENT内幕_第1张图片


列Status中第2位(从第0位开始)为1就表示该列为标识列。最后一列idtval就是标志值,它记录着标志列的IDENT_CURRENT、STEP、BASE和一个状态值。根据标志列的类型不同Indval格式也不同:

IDENT_CURRENT内幕_第2张图片


从名称我们可以知道前面3个值的含义,至于最有一个状态值,我估计其含义是用来判断是否为初始值的,它只有两个值:1和0。
1)若为1表示是初始值(比如表从未包含行或已被截断),函数将会返回种子值。这种状态下新插入记录也不改变IDENT_CURRENT值,而只是将状态修改为0。
2)0则表示已不是初始值。新插入记录会修改表IDENT_CURRENT的值。

不管当前什么状态,每次向拥有标志列的表中插入一行,SQL SERVER都会更新Idtval值的。(在事务日志中会有一条LOP_IDENT_NEWVAL记录)。

你可能感兴趣的:(sql,server)