1

我有一个 Windows SQL Server 数据库,其中一些文章和类别之间存在多对多关系,该关系由一个ArticleCategorie具有两列 => 的表构成[ArticleID] - [CategorieID]

现在的问题是我有一个 csv 文件,它看起来像这样(*图片),有两列文章 id 和文章标签(假设文章 id 是 5;它有 4 个不同的类别,分别具有 id 1,4, 6 和 7) 所以这就是 CSV 的样子 =>

   |ArticleID----|Article Categories---|
   |5------------|1,4,6,7--------------|

*图片 :

在此处输入图像描述

我发现最好的方法是手动将所有数据(文章+类别)添加到表中,如下所示:

http://oi40.tinypic.com/2h4x2s6.jpg

所以这高于我想要的最终结果。不幸的是,我有七百多篇文章,找不到更快的方法来导入它们,有什么解决方案吗?如何快速导入数据?也许我可以进行更好的数据库设计?

4

1 回答 1

0

它不是一个优雅的解决方案,但它有效。openrowset使用或导入数据将数据从 csv 文件导入临时表。然后运行以下代码

declare @aid varchar(88)
declare @cid varchar(88)
declare @cur as cursor
SET @cur = CURSOR FOR(SELECT * FROM temp)
open @cur
FETCH NEXT FROM @cur INTO @aid,@cid
while @@FETCH_STATUS=0
BEGIN
insert into article select @aid,value from dbo.Split(',',@cid)
FETCH NEXT FROM @cur INTO @aid,@cid
END
CLOSE @cur
DEALLOCATE @cur

这是split()函数的代码

CREATE FUNCTION [dbo].[Split] (@sep char(1), @s varchar(5120))
RETURNS table
AS
RETURN (
WITH pieces(pn, start, stop) AS (
SELECT 1, 1, CHARINDEX(@sep, @s)
UNION ALL
SELECT
pn + 1,
stop + 1, CHARINDEX(@sep, @s, stop + 1)
FROM pieces
WHERE stop > 0
)
SELECT pn,
SUBSTRING(@s, start, CASE WHEN stop > 0 THEN stop-start ELSE 5120 END) AS Value
FROM pieces
)
于 2013-07-28T08:00:26.510 回答