sqlserver完成oracle的sequence辦法。本站提示廣大學習愛好者:(sqlserver完成oracle的sequence辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是sqlserver完成oracle的sequence辦法正文
固然這點小成績是難不倒我們法式員的,“max+1啊”,有人會說如許的方法。是的,這類方法完成起來也比擬簡略。固然你或許還會說,最Sql的方法是采取identity列,自增的方法去增長就ok了。然則如許的列假如要完成“YYYYMMDD”+Sequence值 (例如:2008072400001)的格局就不可了。照樣老誠實適用存儲進程來獲得一個Sequence值吧,應用起來也就為所欲為了。
網上罕見的一個存儲進程為 為以後庫一切用到Sequence建一張表,比方“AllSequence”,內含四個字段【名字,終點值,遞增值,以後值】,創立Sequence的時刻就創立一筆記錄,獲得Sequence的時刻就從對應行確當前值按遞增值增長獲得。
在並發性要求不那末高的體系裡,這類進程是沒有成績的。然則並發性要求一旦處於某個量級今後,這個進程經常會碰到成績。
以下為一個改良辦法,合適於高吞吐量的拜訪要求,好比每秒數千次的要求:
-- 假定要給T_0101001創立一個Sequence
-- 創立表SeqT_0101001
create table SeqT_0101001(
-- ID列為自增列
SeqID int identity(1,1) primary key,
-- Sequence值
SeqVal varchar(1)
)
-- 創立從SeqT_0101001表獲得最新Sequence值的存儲進程
create procedure P_GetNewSeqVal_SeqT_0101001
as
begin
-- 聲明新Sequence值變量
declare @NewSeqValue int
-- 設置拔出、刪除操作後的條數顯示撤消
set NOCOUNT ON
-- 拔出新值到SeqT_0101001表
insert into SeqT_0101001 (SeqVal) values ('a')
-- 設置新Sequence值為拔出到SeqT_0101001表的標識列內的最初一個標識值
set @NewSeqValue = scope_identity()
-- 刪除SeqT_0101001表(不顯示被鎖行)
delete from SeqT_0101001 WITH (READPAST)
-- 前往新Sequence值
return @NewSeqValue
end
--應用Sequence
Declare @NewSeqVal int
Exec @NewSeqVal = P_GetNewSeqVal_SeqT_0101001
Print @NewSeqVal
要獲得適才我們提到的 “20080724000056”這類格局的話,上面如許便可以了
select Convert(char(8),Getdate(),112) + right('00000'+CAST(@NewSeqVal AS varchar(5)),5) as mySeq
不外照樣有效的不爽的一點處所,不克不及直接在非存儲進程的select的語句中直接應用。