인보이스를 저장하는 SQL Server 테이블에 인보이스 전화를 걸 수 있습니다. 송장에 대한 연속 자 동 번호 기능을 구현해야합니다 (연속되지 않는 자동 식별이 아님). 또한 예를 들어 사용자 A와 사용자 B 송장의 동시 처리 문제를 동시에 처리해야하지만 두 송장에는 동일한 번호 (분명히)가 없어야합니다.연속 자율 번호
T-SQL의 이상적인 구현 방법은 무엇입니까?
인보이스를 저장하는 SQL Server 테이블에 인보이스 전화를 걸 수 있습니다. 송장에 대한 연속 자 동 번호 기능을 구현해야합니다 (연속되지 않는 자동 식별이 아님). 또한 예를 들어 사용자 A와 사용자 B 송장의 동시 처리 문제를 동시에 처리해야하지만 두 송장에는 동일한 번호 (분명히)가 없어야합니다.연속 자율 번호
T-SQL의 이상적인 구현 방법은 무엇입니까?
우리가 비슷한 것을 한 가지 방법은 [ID]
이라는 단 하나의 열만 가진 useID
이라는 테이블을 만드는 것이 었습니다. 우리는 Integer 데이터 형식을 사용합니다. 이 테이블에는 행이 하나뿐입니다. 조금 더.
이제 이벤트를 기록 할 때마다 SELECT
을 useID
에서 찾아 추적을 위해이 [ID]
값과 함께 트랜잭션을 실행하십시오. 우리가 SELECT
에 [ID]
을 붙인 직후에 useID
의 값을 1 씩 (또는 문제의 시스템에 필요한만큼) 증가시킵니다. 이 방법으로 우리는 독특하고 인접한 [ID]
값을 유지합니다. 새 [ID]
값의 순서에 영향을주지 않고 [ID]
값의 대상에서 삭제할 수 있습니다. 이 성능은 우리가 밤에 ~ 10million 트랜잭션을 사용하여 이것을 실행하는 것으로 매우 좋으며, 우리는 아이템을 '오래'오래 보관하지 않기 때문에 매 3 개월마다 시작 값을 재설정합니다.
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
는이 숫자가 될 당신이 임의의 숫자를 생성 할 수 있습니다, 계속되지만 그것이 있어야하는 경우는 해당 열 IDENTITY
colunm을 만들 수 있습니다 계속
확인이 post이 임의의 숫자
를 만드는 당신이 더 고유 한 송장을 생성 할 필요가 없습니다 또는을 사용할 수 있습니다 여기에, 숫자 송장 번호에 대한 SQL Varchar
열을 만들 수 있습니다열.
만약 내가 ID 열을 사용해야합니까? – Ioannis
SQL Server IDENTITY 열은 동시성과 성능면에서보기에 두 가지 또는 그보다 덜 중요한 문제로 인해 구현됩니다. 전자 때문에 고유 한 값을 가질 수 있습니다. 그러나 후자 때문에 가능한 간격을 참 아야합니다. 이제 당신은 갭의 가능성을 제거하려고 노력 중입니다 (귀하가 IDENTITY를 구현할 때). 그 대가로 당신이 겪고 있다고 생각하는 것은 무엇입니까? –
나는 아주 명확하지 않다 ... 예를 들면 마지막 인보이스는 190 번이고 인보이스 # 32는 삭제된다.그럼 새로운 삽입 된 인보이스 번호 32가 필요합니다. 그게 내가 정체성을 필요 없어요 이유. – Ioannis