SQL转换分号列表进入关系表

时间:2010-08-11 15:44:22

标签: sql sql-server-2000 relationship

我目前有一个包含类型列表(Type_ID,Description)的代码表,但它们作为ID保存在另一个表中;; ID ;; ID ... etc

我正在寻找一个脚本,它将获取这些ID并将它们放在与Type ID相对应的关系表中

例如,在表A中,Type_ID条目可能如下所示:

  

1 ;; 2; 4
   1
   3个; 4
  1 ;; 2; 3; 4

我完全不知道如何做到这一点,并且感谢任何帮助。

2 个答案:

答案 0 :(得分: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,并将等效插入直接替换到您的关系表中。

答案 1 :(得分:2)

可能最简单的方法是使用UDF(用户定义函数),例如Split functions outlined here