2010-06-30 7 views
0

도와 주시겠습니까?SQL 저장 프로 시저 - 도와주세요!

내 스크립트 중 하나에서 일부 데이터를 "항목"테이블에 삽입하고 있습니다. "Item"테이블의 열 중 하나가 "ItemNumber"입니다.

ItemNumber에 사용할 수있는 숫자를 리턴하는 함수 (대부분 Stored proc)를 호출 할 수 있기를 원합니다.

나는 단지 알고

이미 "ItemNumber"을 가지고있는 을 ItemNumber은 고유하므로 자동 증가를 사용할 수 없습니다와 differnt 한 스크립트에서 나는 "항목"에 데이터를 삽입하고 때 충돌이있을 수 있습니다 최대 번호는 "ItemNumber"이고 그 이후에는 아무 것도 쓰지 않아도됩니다.

다음 stored number를 저장하기 위해이 storedProc에 대한 테이블이 필요합니다. 맞습니까?

내가 거기에 MAXNUMBER하고

내가를 작성하는 데 도움이 필요 다음 사용을 위해 1 일까지 MAXNUMBER을 나에게 MAXNUMBER 돌아가도 증가 것 StoredProc가 가진 하나 개의 컬럼 테이블을 만드는 생각했다 저장된 proc 및 사용 INSERT INTO Item 전화와 함께.

편집 : ItemNumber는 NULL 또는 설정 중 하나 인 5 개 세 테이블에서

은 기본적으로 내가 잡아하고 데이터. 설정되는 것들은 모두 유일한 숫자입니다. ItemNumber가 NULL 인 데이터의 경우, 할당하려면 가장 좋은 방법은 무엇입니까?

도와주세요. 당신이 당신의 분야에 IDENTITY 제약 조건을 사용하는 경우, 서버가 중복 된 경우가있을 수 없습니다

-

감사합니다,

부두

+0

좋은 답변을 원한다면 더 읽기 쉽게 만들어보세요. 생각의 기차를 따라 가기가 매우 어렵습니다. –

+1

다른 스크립트에서 행을 삽입해도 자동 증가 ID와의 충돌이 발생하지 않습니다. ID는 스크립트가 아닌 서버에서 생성됩니다. 여러 데이터베이스 또는 테이블을 사용하고 있습니까? –

+0

@Tom H : 예 여러 테이블을 하나의 테이블에 삽입하고 있는데, 일부 행 데이터에는 ItemNumber가 있고 일부는 null입니다. 새 데이터 테이블에서는 Null이 아니고 ItemNumber에 고유해야합니다. – VoodooChild

답변

2

(아마 대부분의 SQL 구현에 적용 가정 SQL 서버) . 주석 노트 중 하나로서이 값은 서버에서 계산되며 응용 프로그램에서는 제공하지 않습니다 (정상적인 상황에서는 제공 할 수 없습니다).

서버가 숫자가 연속적임을 보장하지 않는다는 점에 유의하십시오. 삽입을 수행하고 트랜잭션을 중단하면 사용 된 값은 '손실'됩니다. 서버는 다시 제공하지 않습니다.

ID 번호가 연속적으로 필요한 경우 관리해야 할 테이블을 업데이트하고 효율적이지 않은 테이블을 업데이트해야합니다. (당신은 여전히 ​​IDENTITY 열로 선언 할 수 있지만, 각 업데이트에 대한 테이블에 대해 IDENTITY_INSERT에 설정해야합니다.)

추가 :

아마도

kludge의 비트,하지만 하나 일 수 오프 시나리오. ID가 설정된 새 테이블로 데이터를 복사 한 다음 IDENTITY 제약 조건을 적용하고 NULL ID가있는 테이블을 삽입하십시오 (서버에서 사용자를 할당 할 수 있도록 허용 하시겠습니까?) 그러면 여기에서 특정 문제가 해결 될 수 있습니다. .

+0

고맙습니다. 한가지 더 질문 : IDENTITY를 사용하여 서버에서 ItemNumber에 33을 사용한다고 가정 해 봅시다. 33을 ItemNumber로 사용하여 (Identity_Insert를 사용하여 제안한 것처럼) 삽입하려고하면 어떻게됩니까? 그것은 충돌을 일으키고 작동하지 않을 것입니다. ItemNumbers를 이전과 동일하게 유지하고 null 인 항목 만 할당해야합니다. – VoodooChild

+1

ID 필드를 사용하는 경우 일반적으로 값을 직접 지정하지 않아도됩니다. 즉, 일관된 스레드 안전 방식으로 서버에서 처리하도록하는 것입니다. IDENTITY_INSERT는 서버를 사용해야하며 정상적인 작업이 아니어야합니다. (우리는 기술적 인 이유로 값이 다른 ID 필드와 일치해야하는 특정 테이블과 매우 가끔 수동 데이터를 복구해야합니다. 예외적 인 경우가 많습니다.) – Ragster

+0

(계속) 그러나 - 기존 데이터가있는 경우 테이블에서 NOCHECK로 제약 조건을 적용 할 수 있으며 규칙을 새로운 삽입에만 적용합니다. 기존 규칙을 수동으로 변경할 수 있습니다 (필드 규칙 내에서). 서버는 ID 필드에 이미 존재하는 숫자를 절대로 삽입하지 않습니다. 그것은 당신에게 당신이 삽입 할 수있는 번호를주지 않습니다 - 당신은 기록 삽입을 요구하고 그것은 당신을 위해 숫자를 생성합니다. 그런 다음 마지막으로 삽입 된 ID가 무엇인지 물어볼 수 있습니다. – Ragster