실제로 레코드를 삽입하기 전에 다른 사용자가 이전에 동일한 값을 삽입 할 수 있으므로이 사용자 지정 ID를 선택해서는 안됩니다. 테이블 삽입물을 실행할 수있는 방법은 다음과 같습니다.
insert into John_IEP_Crossing_Dock_Shipment (MyCol1, MyCol2, ID)
select @MyFormValue1,
@MyFormValue2,
convert(varchar(10), current_timestamp, 20)
+ '-'
+ right('000' + cast(cast(right(coalesce(max(ID), '0'), 4) as smallint) + 1 as varchar(4)), 4)
from John_IEP_Crossing_Dock_Shipment
where ID like convert(varchar(10), current_timestamp, 20) + '%'; -- like may use an index in this case
삽입 도중 이전에 ID가 표시됩니다. 이것은 대부분 논쟁의 문제를 해결해야합니다 (어쨌든 4 자리 ID 접미어로 하루당 9,999 개의 인서트 만 가질 수 있습니다). coalesce
은 오늘 데이터가없는 경우를 처리 할 것입니다. " -0001 ").
사용자가 삽입 한 후에이 레코드를 선택해야만 output
키워드를 사용할 수 있습니다.
아직 없으면이 ID 열에 일종의 고유 제한 조건을 추가해야합니다. 적어도 당신은 예외를 처리 할 수 있고 사용자가 경쟁이 아직 문제가된다면 사용자가 다시 시도 할 수 있도록 허용 할 수 있습니다. (이 삽입물이 이 아닐 수 있다고 전문가는 충분히 말할 수 없으므로이 충돌하거나 그러한 것을 방지하기 위해 테이블을 잠글 수 있어야합니다. 물건).
나는 @MartinSmith에 동의하며 오히려 ID 열 (또는 아마 2012 년 sequence)이있는 날짜 열을 만들고이 ID 열을 계산할 수 있습니다. 또한 일부 부품 번호 매기기 구성표를 저장해야하며 때로 건너 뛴 번호는 유효하지 않음을 이해합니다 (삭제가없는 한).
더 많은 것을 알고있는 사람들로부터 의견을 환영합니다.
SQL 엔진은 무엇입니까? –
sql server 2012. – user2484066
은'sql-server'라고 태그를 붙였습니다. –