确定序列是否已经开始

Determine if sequence has started

如果您将序列创建为:

CREATE SEQUENCE TestSequence
START WITH 1
INCREMENT BY 1
MINVALUE 1
MAXVALUE 5
NO CYCLE;

如果您查看 sys.sequences 中的记录,您会看到 start_value1current_value1

如果您随后检索一个值:

SELECT NEXT VALUE FOR TestSequence;

你得到值1。但是如果你再看一下记录,current_value仍然是1。只有当您检索第二个值时,得到 2current_value 才会变成 2.

事实上,如上创建两个相同的序列,并从第一个中选择一个值,从第二个中选择一个值 none,两个序列行之间没有区别(除了不同的 timestamps/IDs ).我怎么知道其中一个已经开始,另一个还没有呢?

这是一个问题的一个原因是我不能依赖 current_value 是 "last value" 或 "next value",因为它开始时是 "next" 但是然后立即变成"last"。我可能需要做的只是丢弃第一个值,然后 current_value 希望始终表示 "last value".

我对此的解决方案是在创建(或重新启动)序列时始终提取并忽略第一个值。然后,您最终会得到属性的一致含义。

然后您需要将 MAXVALUE/maximum_value 视为独占值(即对其加一)。

您还需要从返回的值中减一。

(如果您要使用 1 以外的增量,则需要增加或减去增量。)

因此,要设置一个产生 1-5 的序列,并可靠地读取当前值的实际值:

CREATE SEQUENCE OneToFiveSequence
START WITH 1
INCREMENT BY 1
MINVALUE 1
MAXVALUE 6
NO CYCLE;

SELECT NEXT VALUE FOR OneToFiveSequence;

然后在检索值时,类似于:

var sql = "SELECT NEXT VALUE FOR OneToFiveSequence;";
var result = ExecuteScalar<long>(sql) - 1;
return result;

然后就可以正确创建序列了,看到下一个值应该是1,得到一个1,看到下一个值应该是2,得到一个2,等等