【问题标题】:Database import from text/csv file and many to many relationship从文本/csv 文件和多对多关系导入数据库
【发布时间】:2013-07-28 04:04:28
【问题描述】:

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

*图片:

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

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

【问题讨论】:

  • 您可以使用可以在这边找到的各种Split 例程之一

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


【解决方案1】:

这不是一个优雅的解决方案,但它确实有效。使用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
)

【讨论】:

    猜你喜欢
    • 2016-01-23
    • 1970-01-01
    • 1970-01-01
    • 2016-12-18
    • 2012-01-22
    • 1970-01-01
    • 2014-03-17
    • 1970-01-01
    相关资源
    最近更新 更多