拆分逗号分隔的单元格数据

时间:2010-07-19 19:43:10

标签: tsql sql-server-2008 import split

我有一个包含多个列的电子表格,其中一列是owner_id列。问题是此列包含以逗号分隔的所有者ID列表,而不仅仅是一个。

我已将此电子表格导入我的sql数据库(2008)并完成了其他导入任务,现在由于此过程而产生了parcel_id列。

我需要在parcelOwners表中为每个parcelID / ownerID对创建一个条目,但我不知道如何在所有者ID位于逗号分隔列表中的情况下进行此操作。

我的表格如下:

ImportData
=================
owner_id varchar, 
parcelID int      

sample row (owner_id = '13782, 21431', parcelID = 319)

ParcelOwners
=================
ownerID int,
parcelID int

row from ImportData table should look like:
ownerID = 13782, parcelID = 319
ownerID = 21431, parcelID = 319

对于任何人来说这是一种常见的情况吗?如果是这样,你怎么去解决这个问题?

3 个答案:

答案 0 :(得分:4)

以下函数会将逗号sep列拆分为表格。然后,您需要遍历临时表,并使用单列中的数据将1行插入parcelOwners表。要使其工作,您将需要一个外部循环来遍历parcelOwners表和一个内部循环来迭代每行的@temptable。另外,请不要忘记,如果你在外部循环中排成一行而owner_id列中没有逗号,则不会做任何事情。

CREATE FUNCTION dbo.Split(@String varchar(8000), @Delimiter char(1))       
returns @temptable TABLE (items varchar(8000))       
as       
begin       
    declare @idx int       
    declare @slice varchar(8000)       

    select @idx = 1       
        if len(@String)<1 or @String is null  return       

    while @idx!= 0       
    begin       
        set @idx = charindex(@Delimiter,@String)       
        if @idx!=0       
            set @slice = left(@String,@idx - 1)       
        else       
            set @slice = @String       

        if(len(@slice)>0)  
            insert into @temptable(Items) values(@slice)       

        set @String = right(@String,len(@String) - @idx)       
        if len(@String) = 0 break       
    end   
return       
end 

答案 1 :(得分:2)

您可以轻松地利用SQL Server XML函数执行此操作:

WITH xmlData (xml_owner_id,parecelID) AS (
    /* make into xml */
    SELECT cast('<x>'+replace(owner_id,',','</x><x>')+'</x>' as XML)  AS xml_owner_id, parecelID
    FROM ImportData
)
SELECT x.value('.','int') AS owner_id, parecelID /* split up */
FROM xmlData
CROSS APPLY xmlData.xml_owner_id.nodes('//x') AS func(x)

答案 2 :(得分:1)

(回应@ senloe关于如何使用@RandomBen提供的功能的问题)

This answer上一个问题显示了如何使用OUTER APPLY将函数应用于表中的每一行。在你的情况下,并假设你已经运行@ RandomBen的代码来创建dbo.Split函数,语法将如下所示:

INSERT INTO ParcelOwners (ownerId, parcelID)
SELECT CONVERT(int, Results.items), ImportData.parcelID
FROM ImportData
OUTER APPLY dbo.Split(ImportData.owner_id, ',') AS Results

(我现在无法访问SQL Server,所以我还没有尝试过。你可以在没有第一行的情况下运行它,也就是从SELECT开始运行它,看看它之前要生成什么输出你真的做INSERT)。