2010-08-11 2 views
2

현재 유형 목록 (Type_ID, Description)이 포함 된 코드 테이블이 있지만 ID ;; ID ;; ID ...와 같은 다른 테이블에 저장됩니다.관계 테이블에 세미콜론리스트를 변환하는 SQL

나는 그 ID의의를 타고 TYPE_ID 항목처럼 볼 수 있었다 테이블 A에 예를 들어이 유형의 ID

에 해당하는 관계 테이블에 배치하는 스크립트를 찾고 있어요 :

1; 2 ;; 4
3; 4

나는 완전히이 작업을 수행하는 방법에 대한 난처한 상황에 빠진 오전 어떤 도움이 감사 1; 2; 3; 4
.

+0

그리고 가능한 한 데이터베이스 디자인을 수정하십시오. 테이블에 어떤 것도 목록으로 저장해서는 안됩니다. 필요한 경우 관련 테이블이 필요합니다. – HLGEM

+0

그게 내가하고있는 과정입니다. 다음은 관계 테이블로 만들 수있는 4 개의 열을 제거하는 것입니다. Station 1-4 ... – Gage

답변

3

우선, UDF 경로로 이동하여 바퀴를 다시 만들지 않는 것이 좋습니다. 그러나,이 일회성 활동 같은 소리 주어진, 당신은 다음을 사용할 수

declare @output table (parentKey int, value int) 

declare @values table (idx int identity(1, 1), parentKey int, value varchar(255)) 

-- Modify the below query to capture the data from your table 
insert into @values (parentKey, value) values(1, '1;;2;;4'),(2, '1'),(3, '3;;4'),(4, '1;;2;;3;;4') 

declare @i int 
declare @cnt int 

select @i = MIN(idx) - 1, @cnt = MAX(idx) from @values 

while(@i < @cnt) 
begin 
    select @i = @i + 1 

    declare @value varchar(255) 
    declare @key int 

    select @value = value, @key = parentKey from @values where idx = @i 

    declare @idx int 
    declare @next int 

    select @idx = 1 

    while(@idx <= LEN(@value)) 
    begin 
     select @next = CHARINDEX(';;', @value, @idx) 

     if(@next > @idx) 
     begin 
      insert into @output (parentKey, value) values(@key, SUBSTRING(@value, @idx, @next - @idx)) 

      select @idx = @next + 2 
     end 
     else 
     begin 
      insert into @output (parentKey, value) values(@key, SUBSTRING(@value, @idx, LEN(@value) - @idx + 1)) 

      select @idx = LEN(@value) + 1 
     end 
    end 
end 

select * from @output 

@output 테이블 변수는 이제 당신이 찾고있는 매핑이 포함되어 있습니다. 끝에서 목적지까지 복사하거나 쿼리에서 @output을 제거하고 동등한 삽입을 관계 테이블로 직접 대체 할 수 있습니다.

+0

그게 바로 제가 고마운 자리를 찾은 이유였습니다. 한 시간 일이 롤 – Gage

2

아마도 가장 쉬운 방법은 Split functions outlined here과 같은 UDF (사용자 정의 함수)을 사용하는 것입니다.

+0

+1 위대한 링크 - 감사합니다! –

+0

(이 UDF는이 Q의 태그로 인해 SQL Server 2K에만 해당되므로 CLR 기능을 사용하는보다 나은 aproaches가 있음을 확인하십시오.) – RedFilter