SQL Server如何破坏序列中的下一个值?

时间:2018-04-28 16:49:05

标签: sql-server sequence system-views

如果更改序列以使用与其当前值完全相同的值重新启动,则下一个值将是指定的值,而不是当前值加上增量。一切都很好,但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会发生变化。

所以有人知道我的旗帜理论是否正确,如果是,那么这个旗帜所在的位置(即它是否在可访问的系统视图中)。

1 个答案:

答案 0 :(得分:3)

  

所以有人知道我的旗帜理论是否正确,如果是,那么   此标志位于(即它是否位于可访问的系统视图中)。

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

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

SELECT value
FROM   sys.sysobjvalues
WHERE  objid = OBJECT_ID('abc');

以下是在将序列递增4次(并将数据库设置为脱机以确保将所有缓存的更改写入光盘)后有机地达到9之后的外观。

0x030000000000000002000000000000000000000000000080FFFFFFFFFFFFFF7F090000000000000000

以下是运行ALTER SEQUENCE abc RESTART WITH 9;

后的情况
0x090000000000000002000000000000000000000000000080FFFFFFFFFFFFFF7F090000000000000001

我想象一开始(0309)的变化是因为START WITH现在已经改变了。最后一个字节有你寻找的标志。

但你为什么关心?任何计算下一个值的尝试都将充满竞争条件和不保证的行为。您应该在需要时致电NEXT VALUE,并将其提供给您。