从text / csv文件导入数据库以及多对多关系

时间:2013-07-28 07:08:09

标签: sql-server database-design database-migration

我有一个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--------------|

*图片:

enter image description here

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

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

所以这超出了我想要的最终结果。不幸的是,我有超过七百篇文章,无法找到更快的方式导入它们,任何解决方案?如何快速导入数据?也许我可以选择更好的数据库设计?

1 个答案:

答案 0 :(得分: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
)