2011-10-09 4 views
0

처음 몇 가지 기준에 따라 고유 한 시퀀스 번호를 생성 한 다음 DB에 저장하고 생성 된 번호를 임계 값에 도달 할 때까지 하나씩 증가시킨 다음 생성 된 번호를 재설정 할 때마다 선택해야합니다 .중복없이 시퀀스 번호 생성

이미 숫자를 생성하여 DB에 저장 했으므로이 숫자를 호출하고 하나씩 증가시키는 저장 프로 시저가 있으며 저장된 값을 새 값으로 업데이트합니다 (증가 후). 문제는 이제 2 명의 사용자가 같은 시간에 동일한 프로 시저를 호출하고 각각 동일한 저장된 생성 된 숫자를 선택한 다음 증분하여 새 값으로 저장된 값을 업데이트 할 수 있습니다 (업데이트가 죽은 잠금없이 순차적으로 수행된다고 가정). 이 경우 2 명의 사용자가 동일한 번호를 가져 와서 번호 규칙을 손상시킵니다. 동시 사용자가 같은 번호를 선택하는 것을 피할 수 있습니까?

참고 : 생성 된 수는 형 NVARCHAR (200)

답변

0

입니다 당신은 NEWSEQUENTIALID에 기본 키()와 고유 식별자로 데이터 형식의 기본 valut을 설정해야합니다.

+1

일부 코드에서 형식이 지정되어 있기 때문에 생성 된 숫자가 nvarchar (200)이므로이 경우 – Shabrawy

+0

에 고유 한 식별자를 사용할 수 없으므로 EOF에 커서를 놓고 몇 가지 critica로 하나씩 증가시킬 수 있습니다 HEXADECIMAL을 사용하고 있습니다. –

+0

아니, 무슨 뜻인지 모르겠다 !! 내가 DB에 숫자를 가지고 그 날 위해 씨앗을 가지고 내가 선택할 때마다 내가 선택한 숫자가 한 번 이상 사용되는 방법을 사용하지 않아도되는 문제로 시드 번호를 업데이트해야한다고 가정합니다. 이 중복을 피할 수 있습니까? – Shabrawy

-1

중요한 해킹이긴하지만 자동 증분 키가있는 다른 테이블을 유지하는 것이 더 나은 방법이되어야하지만이 방법을 사용할 수 있습니다.

그 키를 절차 시작시 삽입 할 수 있으며 ID가 반환됩니다. 그런 다음 모듈러스 논리를 적용하여 고유 한 증가 키를 리턴 할 수 있습니다.

예를 들어 테이블은 다음과 같습니다

CREATE TABLE [dbo].[uniqueidentifier](
    [id] [int] IDENTITY(1,1) NOT NULL, 
    [b] [bit] NOT NULL 
) ON [PRIMARY] 

다음 다음 키를 필요할 때마다 할 X는 재활용 임계 값입니다 다음

declare @rtn int 
delete * from uniqueidentifier 
insert into uniqueidentifier values (1) 
set @rtn = scope_identity() % X 

나는 그것이 더러워 말했듯 및 defo a hack 그러나 작동하지만 나는이 숫자를 생성하는 저장 프로 시저의 논리를 재구성 할 수 있다고 강력히 제안합니다.

희망이 있거나 도움이 되었기를 바랍니다.

+0

다시 생성 된 숫자는 증가 된 후 처음으로 생성되지 않으며 형식은 NVARCHAR (200)입니다. 응답하기 전에 신중하게 질문을 읽으십시오 !!! – Shabrawy

+0

그것이 nvarchar라고 동의하고 있지만이 패턴이 문자 증분이되는지 여부와 상관없이 증가하는 방식에 대한 패턴이 있어야합니다.이 경우 문자 숫자 식으로 변환하는 기준으로 증가하는 숫자를 사용할 수 있습니다 끈. nvarchar 문자열 형식이 어떻게 나타나는지와 사람이 필요한 키의 구조를 기반으로 더 많은 조언을 제공 할 수있게되면서 어떻게 증가하는지 예제를 제시하는 것이 좋습니다. 그것이 nvarchar되는 캐스트 기능입니다 – paul