2013-06-14 3 views
1

이 쿼리를 실행하면 ID에 null 값이 반환됩니다. 이 코드는 id 열의 최대 값을 가져옵니다. 그것은 2013-06-13-0002 이드 럼 (인해 0001보다 큰 값 인 0002의) 가야null을 반환하는 SQL 쿼리?

2013-06-13-0001 
2013-06-13-0002 

은 .. 쿼리가 최대 ID를 얻고 그것을 추가 1로되어있다.

SELECT 
    ID = LEFT(max(ID), 10) + '-' + 
     RIGHT('000' + CONVERT(VARCHAR, CONVERT(INT, RIGHT(max(ID), 4)) + 1), 4) 
FROM John_IEP_Crossing_Dock_Shipment 
WHERE 
    LEFT(ID, 10) = CONVERT(VARCHAR(10), Getdate(), 20) 
+0

SQL 엔진은 무엇입니까? –

+0

sql server 2012. – user2484066

+0

은'sql-server'라고 태그를 붙였습니다. –

답변

1

실제로 레코드를 삽입하기 전에 다른 사용자가 이전에 동일한 값을 삽입 할 수 있으므로이 사용자 지정 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 열을 계산할 수 있습니다. 또한 일부 부품 번호 매기기 구성표를 저장해야하며 때로 건너 뛴 번호는 유효하지 않음을 이해합니다 (삭제가없는 한).

더 많은 것을 알고있는 사람들로부터 의견을 환영합니다.

+0

mycol1, mycol2에 아무것도 넣지 않아도됩니까? myformvalue1과 2에 무엇을 넣어야합니까? – user2484066

+0

이것은 테이블에있을 수있는 다른 열의 단순한 일반적인 예입니다. 나는 당신이 웹 앱에서 삽입하고 있다고 상상했다. 삽입시 널이 아닌 열만 필요합니다. 나중에 삽입하기 위해 셀렉트를 실행할 수도 있습니다.하지만 이는 처음주의 사항에 위배됩니다. –

+0

아 맞아, 나는 mycol을위한 자리 표시자를 꺼냈다. 방금 ID로 남겼습니다. 예, 웹 앱에서 삽입하고 있습니다. 여전히 @myform이 무엇인지 모르겠다. 미안 D : 내가 그걸로 무엇을 할 수 있는지 설명 할 수 있겠 니? – user2484066