程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> 其他數據庫知識 >> MSSQL >> sqlserver完成oracle的sequence辦法

sqlserver完成oracle的sequence辦法

編輯:MSSQL

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的語句中直接應用。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved