2009-06-30 104 views
0

我有一個程序的要求,我正在努力將作業編號存儲爲YY - ######每年在000001開始遞增的數字前面是最後兩位數字的一年。定期重新啓動自動編號的SQL Server

我能想出的唯一方法是創建一個CurrentJob表,並使用一個標識列以及年份的最後兩位數字和一個ArchiveJob表,然後通過一個聯合視圖。然後,我不得不在一年的初期將CurrentJob複製到ArchiveJob並截斷CurrentJob。

是否有更簡單的方法在一張表中重新啓動編號(顯然不是一個標識列)?

客戶端在新年關閉,所以在一年的變化(學校)不應該有數據輸入。

+0

感謝您的所有輸入。實際上在John MacIntyre的http://stackoverflow.com/questions/675388/675444#675444中找到了另一個線程中的解決方案(錯過了它在Stack中的初始搜索)。不使用自動編號,但防止需要第二張表或擔心重新設置表。 但是,標出了Christian的評論作爲答案,因爲那是我在其他方面正在考慮的那個。 – monkeypushbutton 2009-07-01 12:32:50

回答

3

身份列是迄今爲止在SQL Server中生成連續數字的最快和最併發的解決方案。儘管如此,並不需要太複雜。只需要一張表來生成身份值,並在年底重置。這裏有一個簡單的例子:

-- Sequence generating table 
create table SequenceGenerator (
    ID integer identity(1, 1) primary key clustered 
) 

-- Generate a new number 
insert into SequenceGenerator default values 
select @@identity 

-- Reset the sequence 
truncate table SequenceGenerator 
if ident_current('SequenceGenerator') <> 1 begin 
    dbcc checkident('SequenceGenerator', reseed, 0) 
    dbcc checkident('SequenceGenerator', reseed) 
end else begin 
    dbcc checkident('SequenceGenerator', reseed, 1) 
end 
1

還有一個類似的問題#761378.。 (注意:它使用MySql,但原理相同)

接受的答案建議使用第二個表來管理當前ID。

但是最受歡迎的問題是不這樣做!請注意HLGEM對帖子的回答,爲什麼不這樣做。

+0

如果您正在討論由開發人員設計的唯一行標識符,HLGEM對該帖子的回答非常有意義。如果您正在討論業務需求中指定的外部標識符,那麼HLGEM的答案與此無關。這個問題還沒有具體說明要求是什麼,所以讓我們保留判斷。 – 2009-07-01 07:32:58

0

您可以使用來自here的「reseed」命令重置起始值。