确定序列是否已经开始
Determine if sequence has started
如果您将序列创建为:
CREATE SEQUENCE TestSequence
START WITH 1
INCREMENT BY 1
MINVALUE 1
MAXVALUE 5
NO CYCLE;
如果您查看 sys.sequences
中的记录,您会看到 start_value
的 1
和 current_value
的 1
。
如果您随后检索一个值:
SELECT NEXT VALUE FOR TestSequence;
你得到值1
。但是如果你再看一下记录,current_value
仍然是1
。只有当您检索第二个值时,得到 2
,current_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,等等
如果您将序列创建为:
CREATE SEQUENCE TestSequence
START WITH 1
INCREMENT BY 1
MINVALUE 1
MAXVALUE 5
NO CYCLE;
如果您查看 sys.sequences
中的记录,您会看到 start_value
的 1
和 current_value
的 1
。
如果您随后检索一个值:
SELECT NEXT VALUE FOR TestSequence;
你得到值1
。但是如果你再看一下记录,current_value
仍然是1
。只有当您检索第二个值时,得到 2
,current_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,等等