Sql server SQL Server如何确定序列中的下一个值?

Sql server SQL Server如何确定序列中的下一个值?,sql-server,sequence,system-views,Sql Server,Sequence,System Views,如果将序列更改为使用与其当前值完全相同的值重新启动,则下一个值将是指定的值,而不是当前值加上增量。一切都很好,但是SQL Server引擎如何决定使用当前值而不是添加增量?我假设某个地方有一个标志来指示当前状态 查看这一系列事件前后的sys.sequences视图,我只观察到ALTER SEQUENCE语句后面的objects modify_date和start_value列发生了变化。在从最初创建的序列或ALTER sequence…RESTART语句中选择第二个下一个值后,获取下一个值仅会更

如果将序列更改为使用与其当前值完全相同的值重新启动,则下一个值将是指定的值,而不是当前值加上增量。一切都很好,但是SQL Server引擎如何决定使用当前值而不是添加增量?我假设某个地方有一个标志来指示当前状态

查看这一系列事件前后的sys.sequences视图,我只观察到ALTER SEQUENCE语句后面的objects modify_date和start_value列发生了变化。在从最初创建的序列或ALTER sequence…RESTART语句中选择第二个下一个值后,获取下一个值仅会更改当前_值列

下面是一个要演示的示例(modify_date列仅显示为时间):

已创建序列,“当前值”列显示序列中要使用的下一个值

SELECT NEXT VALUE FOR abc;  -- 3
SELECT NEXT VALUE FOR abc;  -- 5
SELECT NEXT VALUE FOR abc;  -- 7
SELECT NEXT VALUE FOR abc;  -- 9

modify_date      current_value increment   start_value
---------------- ------------- ----------- -----------
17:39:57.04      9             2           3
当前_值现在显示使用的最后一个值,即下一个值将是当前值加上增量

ALTER SEQUENCE abc RESTART WITH 9;

modify_date      current_value increment   start_value
---------------- ------------- ----------- -----------
17:40:17.42      9             2           9
所以日期和开始值已经改变了,我猜某个地方已经设置了一些标志来指示这个序列现在需要从当前值开始

SELECT NEXT VALUE FOR abc;  -- 9

modify_date      current_value increment   start_value
---------------- ------------- ----------- -----------
17:40:17.42      9             2           9
在sys.sequences视图中未观察到任何更改

SELECT NEXT VALUE FOR abc;  -- 11

modify_date      current_value increment   start_value
---------------- ------------- ----------- -----------
17:40:17.42      11            2           9
现在,序列按预期继续,视图中仅更改当前的_值

那么,是否有人知道我的标志理论是否正确,如果正确,该标志位于何处(即,它是否位于可访问的系统视图中)

那么,有人知道我的旗帜理论是否正确吗?如果正确,在哪里 此标志驻留(即,它位于可访问的系统视图中)

是的-看起来这可能是正确的。但不是在一个非常容易访问的系统视图中

如果通过DAC连接,则可以运行

SELECT value
FROM   sys.sysobjvalues
WHERE  objid = OBJECT_ID('abc');
下面是在将序列增加4次(并将数据库设置为脱机以确保所有缓存的更改都写入光盘)后,它如何有机地达到9

下面是使用9运行
ALTER SEQUENCE abc RESTART后的情况

0x090000000000000002000000000000000000000000000080FFFFFFFFFFFFFF7F090000000000000001
我想最开始的变化(从
03
09
)是因为
的开头现在已经改变了。最后一个字节具有您要查找的标志


但你为什么在乎?任何计算下一个值的尝试都将充满竞争条件和无法保证的行为。您应该在需要时调用
NEXT VALUE
,并获取它所提供的内容。

测试总是会产生有趣的场景,而这不是针对生产环境的。我为什么在乎?只是为了更好地理解SQL Server的工作原理而进行的自我改进。谢谢你给我指明了正确的方向。
0x030000000000000002000000000000000000000000000080FFFFFFFFFFFFFF7F090000000000000000
0x090000000000000002000000000000000000000000000080FFFFFFFFFFFFFF7F090000000000000001