2017-10-09 65 views
2

sys_sequences上沒有next_value列,所以您需要獲取current_value並增加它。如何知道序列的下一個值而不增加它?

select convert(int, current_value) + 1 as next_value 
from sys.sequences 
where name = 'my_sequence' 

重新啓動序列時出現問題,以前的查詢將返回錯誤的值。

alter sequence my_sequence restart with 100; 

select convert(int, current_value) + 1 as next_value 
from sys.sequences 
where name = 'my_sequence' 

這將返回101而不是真正的未來價值,這是100

你知道的一種可靠的方法來計算一個序列的下一個值?

+3

爲什麼在使用之前你需要知道下一個值會是什麼?如果你對它有這麼多的依賴,那麼無論如何我都會對代碼中的競爭條件保持警惕。 –

+2

你可以通過檢查'sys.sequences'目錄視圖來知道序列的**當前**值,但是你永遠無法可靠地知道將要發佈的**下一個值** - 你必須調用' SELECT ... NEXT VALUE FOR ...'爲了實際得到下一個值 - 沒有提前「偷看」 –

+0

@SeanLange我使用序列生成賬單號碼,並且我想通知用戶最後一個值/下一個值按計費順序。但是在SQL Server上,我無法知道current_value實際上是最後一個值還是將在該序列上使用的下一個值。 –

回答

1

您是否知道計算序列的下一個值的可靠方法?

據我所知,你是正確的。一種可能的解決方法是將您的重新啓動值設置爲比您想要的還要少,並在您的restart之後用虛擬變量用完第一個值。

create sequence my_sequence as int start with 1; 
alter sequence my_sequence restart with 99; 
declare @dummy int = next value for my_sequence; 

select convert(int, s.current_value) + convert(int,s.increment) as next_value 
from sys.sequences s 
where s.name = 'my_sequence'; 

dbfiddle.uk

但作爲marc_s指出,沒有可靠的 「窺視」,爲下一個值。

+0

我喜歡這個解決方法,很簡單。我要這樣設定,謝謝。 –

+0

@MarcGuillot樂意幫忙! – SqlZim

相關問題