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),表、视图或表值函数的每个列在该基表中有对应的一行,过程或函数的每个参数也存在对应的行。该基表的定义如下:


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


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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值