如果您更改序列以使用与其当前值完全相同的值重新启动,则下一个值将是指定的值,而不是当前值加上增量。一切都很好,但是 SQL Server 引擎如何确定使用当前值而不是添加增量?我假设某处有一个标志来指示当前状态。
查看这一系列事件之前和之后的 sys.sequences 视图,我只观察到 ALTER SEQUENCE 语句之后对象 modify_date 和 start_value 列的变化。获取 NEXT VALUE 仅在从最初创建的序列或 ALTER SEQUENCE...RESTART 语句中选择第二个 NEXT VALUE 之后更改 current_value 列。
这是一个演示示例(modify_date 列仅显示为时间):
CREATE SEQUENCE abc START WITH 3 INCREMENT BY 2;
modify_date current_value increment start_value
---------------- ------------- ----------- -----------
17:39:57.04 3 2 3
已创建序列,并且 current_value 列显示要在序列中使用的下一个值。
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
current_value 现在显示使用的最后一个值,即下一个值将是当前值加上增量。
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
现在序列按预期继续,只有 current_value 在视图中发生变化。
那么有谁知道我的标志理论是否正确,如果正确,这个标志所在的位置(即它是否在可访问的系统视图中)。