sqlserver Oacle 을 실현 하 는 sequence 방법

2039 단어 sqlserversequence
물론 이 작은 문 제 는 우리 프로그래머 의'max+1 아'를 어렵 게 할 수 없다.이런 방식 을 말 하 는 사람 이 있다.예,이런 방식 은 실현 하기 도 간단 합 니 다.물론 가장 Sql 방식 은 idenity 열 을 사용 하여 증가 하 는 방식 으로 증가 하면 ok 이 라 고 말 할 수 있 습 니 다.그러나 이런 열 이'YYYYYMMDD'+Sequence 값(예 를 들 어 2008072400001)의 형식 을 실현 하려 면 안 된다.그냥 성실 하고 실 용적 인 저장 과정 으로 Sequence 값 을 얻 는 것 이 좋 겠 습 니 다.사용 하기에 도 마음대로 됩 니 다.
인터넷 에서 흔히 볼 수 있 는 저장 과정 은 현재 라 이브 러 리 에 사용 되 는 Sequence 에 표를 만 드 는 것 이다.예 를 들 어'AllSequence'는 네 개의 필드[이름,출발점 값,부가 가치,현재 값]을 포함 하고 Sequence 를 만 들 때 하나의 기록 을 만 들 고 Sequence 를 얻 을 때 해당 줄 의 현재 값 에서 부가 가치 에 따라 증가한다.
동시성 요청 이 그리 높 지 않 은 시스템 에 서 는 이런 과정 에 문제 가 없다.그러나 동시성 요청 이 어떤 급 에 있 으 면 이 과정 에 문제 가 생기 는 경우 가 많다.
다음은 1 초 에 수천 번 의 요청 과 같은 높 은 스루풋 의 방문 요청 에 적합 한 개선 방법 입 니 다.

-- 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 의 문장 에서 직접 사용 할 수 없다.

좋은 웹페이지 즐겨찾기