2011-08-03 3 views
0

인보이스를 저장하는 SQL Server 테이블에 인보이스 전화를 걸 수 있습니다. 송장에 대한 연속 자 동 번호 기능을 구현해야합니다 (연속되지 않는 자동 식별이 아님). 또한 예를 들어 사용자 A와 사용자 B 송장의 동시 처리 문제를 동시에 처리해야하지만 두 송장에는 동일한 번호 (분명히)가 없어야합니다.연속 자율 번호

T-SQL의 이상적인 구현 방법은 무엇입니까?

+0

만약 내가 ID 열을 사용해야합니까? – Ioannis

+0

SQL Server IDENTITY 열은 동시성과 성능면에서보기에 두 가지 또는 그보다 덜 중요한 문제로 인해 구현됩니다. 전자 때문에 고유 한 값을 가질 수 있습니다. 그러나 후자 때문에 가능한 간격을 참 아야합니다. 이제 당신은 갭의 가능성을 제거하려고 노력 중입니다 (귀하가 IDENTITY를 구현할 때). 그 대가로 당신이 겪고 있다고 생각하는 것은 무엇입니까? –

+0

나는 아주 명확하지 않다 ... 예를 들면 마지막 인보이스는 190 번이고 인보이스 # 32는 삭제된다.그럼 새로운 삽입 된 인보이스 번호 32가 필요합니다. 그게 내가 정체성을 필요 없어요 이유. – Ioannis

답변

2

우리가 비슷한 것을 한 가지 방법은 [ID]이라는 단 하나의 열만 가진 useID이라는 테이블을 만드는 것이 었습니다. 우리는 Integer 데이터 형식을 사용합니다. 이 테이블에는 행이 하나뿐입니다. 조금 더.

이제 이벤트를 기록 할 때마다 SELECTuseID에서 찾아 추적을 위해이 [ID] 값과 함께 트랜잭션을 실행하십시오. 우리가 SELECT[ID]을 붙인 직후에 useID의 값을 1 씩 (또는 문제의 시스템에 필요한만큼) 증가시킵니다. 이 방법으로 우리는 독특하고 인접한 [ID] 값을 유지합니다. 새 [ID] 값의 순서에 영향을주지 않고 [ID] 값의 대상에서 삭제할 수 있습니다. 이 성능은 우리가 밤에 ~ 10million 트랜잭션을 사용하여 이것을 실행하는 것으로 매우 좋으며, 우리는 아이템을 '오래'오래 보관하지 않기 때문에 매 3 개월마다 시작 값을 재설정합니다.

2

IDENTITY 컬럼.

영숫자 인 송장 번호가 필요한 경우 질문을 필요한 형식으로 업데이트하는 것이 좋습니다.

레코드를 삭제하거나 INSERT 중에 오류가 발생하거나 테이블에 INSERT가 포함 된 트랜잭션을 롤백하거나 관련 dbcc 명령으로 시드를 업데이트하는 경우에만 간격이 있습니다.

갭을 재사용해야하는 경우 (예 : 송장과 같은 것, 예를 들어 예제 송장 # 32에 나중에 송장 # 190이 있음) : 그런 다음 직렬화 가능한 트랜잭션에서 가장 낮은 여유 값을 찾고, ID 삽입을 설정하고, 해당 Id 값을 가진 행을 삽입 한 다음 ID 삽입을 설정하고 트랜잭션을 커밋 할 수 있습니다. (테스트되지 않은)이 같은

뭔가 :이 필요하지 않은 경우

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE 

BEGIN TRAN 
SET IDENTITY_INSERT dbo.myTable ON 

DECLARE @minId int = -1 

;WITH cterows(Id, rownum) 
AS 
(
    SELECT Id, row_number() OVER(ORDER BY Id ASC) AS rownum 
) 
SELECT @minId = MIN(rownum) FROM cterows 
WHERE Id <> rownum 

IF (@minId IS NOT NULL AND @minId <> -1) 
    BEGIN 
    -- found a gap 
    -- Insert at @minId 
    END 
ELSE 
    BEGIN 
    -- No gap, INSERT as normal 
    END 


SET IDENTITY_INSERT dbo.myTable OFF; 
COMMIT 
1

는이 숫자가 될 당신이 임의의 숫자를 생성 할 수 있습니다, 계속되지만 그것이 있어야하는 경우는 해당 열 IDENTITY colunm을 만들 수 있습니다 계속

확인이 post이 임의의 숫자

0

를 만드는 당신이 더 고유 한 송장을 생성 할 필요가 없습니다 또는을 사용할 수 있습니다 여기에, 숫자 송장 번호에 대한 SQL Varchar 열을 만들 수 있습니다열.