2013-04-11 2 views
-1

SQL Server 2008을 사용하면 세 개의 테이블, 테이블 a, 테이블 b 및 테이블 c가 있습니다. ,TSQL : 다음에 사용 가능한 ID가 있습니다

모두는 ID 열이 있지만 ID 열 특정 논리 다음하는 varchar

현재 저장된 프로 시저 이름 PARAM을는 C 표 A에 대해 상기 ID 열 B를 표 들면, identity integer이고 테이블 a 또는 테이블 b에 삽입하고 ID를 얻고 접두사 'A'또는 'B'를 입력 한 다음 테이블 c에 삽입하십시오.

문제는 표 C ID 열이 중복 값을 가질 가능성이 있습니다. 즉, 표 A의 ID가 2 인 경우 표 C의 ID 열에 'A2', 'A3', 'A5' 테이블 C의 다음 사용 가능한 값을 식별하기 위해 T-SQL 쿼리를 작성한 다음 이에 따라 테이블 A/B를 업데이트해야합니까?

[업데이트]이, 1. 입력 파라미터의 현재 단계 의존한다 는 표 C에 삽입하는 테이블 A와 테이블 B 2 초기화 시드 값 = @@ IDENTITY 3. 계산 ID 값을 삽입 접두사 'A'또는 시드 값이 'B'인 경우 4. 3 단계의 ID 값으로 테이블 C에서 레코드 일치를 찾습니다. 레코드를 찾지 못하면 삽입하고 시드 값을 1 씩 늘린 다음 반복하십시오 3 단계

특정 값 범위에있는 문제는 테이블 C ID에 값의 거대한 블록이있을 수 있습니다. 즉, A3000에서 A500000까지의 테이블 C ID에 존재합니다. 기존 쿼리를 따르는 경우 데이터베이스 쿼리가 너무 느립니다. 논리. 접두어없이 최소 숫자를 현명하게 얻으려면 논리를 알아야합니다.

설명하기가 어렵습니다. 더 의미가 깊어지기를 바랍니다. 사전에 감사드립니다.

+5

당신은 이것을 재 설계하는 것이 훨씬 낫습니다. – RBarryYoung

+1

테이블 A와 B의 'ID'가 실제로 'INT IDENTITY'인 경우 - 어떻게 중복을 줄 수 있습니까? 테이블 C에서 테이블 A 또는 B의 ID 열의 ** 고유 ** 값을 더한 테이블 접두사 (A 또는 B)를 사용하는 경우 불가능할 것 같습니다. –

+0

@ Tommy Wang, 게시물을 수정하고 더 자세한 예제를 제공 할 수 있습니까? – PowerUser

답변

1

이 트릭을 수행해야합니다. 간단한 자체 추출 예제는 SSMS에서 작동합니다. 나는 경우에 대비해 명령을 내렸다. @Data가있는 위치로 테이블을 변경 한 다음 ID 필드를 변경하여 'ID'를 바꿉니다.

declare @Data Table (Id varchar(3)); 

insert into @Data values ('A5'),('A2'),('B1'),('A3'),('B2'),('A4'),('A1'),('A6'); 

With a as 
    (
    Select 
     ID 
    , cast(right(Id, len(Id)-1) as int) as Pos 
    , left(Id, 1) as TableFrom 
    from @Data 
    ) 
select 
    TableFrom 
, max(Pos) + 1 as NextNumberUp 
from a 
group by TableFrom 

편집 : 프로덕션 데이터에 대해 걱정하지 할 경우이 마지막 부분은 내가 쓴 개정 추가 할 수 있습니다

에 관계없이
Select 
    TableFrom 
, max(Pos) as LastPos 
into #Temp 
from a 
group by TableFrom 

select TableFrom, LastPos + 1 
from #Temp 

만약 당신이이 부분을 칠해야 할 것이 있었다 프로덕션 환경 데이터를 얻으려는 경우도 있습니다. 데이터 세트가 너무 크지 않고 varchar (256) 이하이고 5 백만 행 이하인 경우 전체 열을 tableC에서 임시 테이블로 덤프 할 수 있습니다. 솔직히 쿼리 성능 대 수입은 시스템마다 크게 달라집니다.

+1

이것은 단일 사용자 테스트 환경에서 잘 작동 할 수 있습니다.하지만 부하가 많은 프로덕션 시스템에서 여러 사용자가 데이터베이스를 공격하면 조만간 SELECT MAX() + 1 방식이 비참하게 실패하고 중복 값을 생성합니다. ..... –

+0

충분히 사실 나는 진실한 수있는 상태에 대한 임시 테이블로 내 대답을 업데이 트됩니다. – djangojazz

+1

추한 질문에 대한 좋은 대답은 +1입니다. 그러나 나쁜 데이터 디자인을 실생활에 적용하는 것입니다. – Paparazzi

1

디자인에 따라 A와 B가 고유하다는 것을 고려하여 표 C에 중복이 없어야합니다.

A | B | C 
1 1 A1 
2 2 A2 
     B1 
     B2 
관련 문제