我有一个包含多个列的电子表格,其中一列是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
对于任何人来说这是一种常见的情况吗?如果是这样,你怎么去解决这个问题?
答案 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)。