2013-07-28 1 views
1

У меня есть база данных Windows SQL Server с отношением «многие-ко-многим» между некоторыми статьями и категориями, отношение составлено таблицей ArticleCategorie с двумя столбцами =>[ArticleID] - [CategorieID] ,Импорт базы данных из текстового/CSV-файла и многих из многих отношений

Проблема в том, что у меня есть файл csv, который выглядит так (* картинка) с двумя столбцами: идентификатор статьи и теги статьи (предположим, что идентификатор статьи равен 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

Так что это выше конечный результат, что я хочу. К сожалению, у меня есть более семи сотен статей, и вы не можете найти более быстрый способ их импорта, какие-либо решения? Как я могу быстро импортировать свои данные? Может быть, я могу пойти на лучший дизайн базы данных?

+0

Вы можете использовать один из различных [Split] (http://stackoverflow.com/a/16993267/1699210), которые можно найти на этой стороне – bummi

ответ

0

Его не изящное решение, но оно работает. Импортируйте данные из файла csv во временную таблицу с помощью openrowset или импортируйте данные. Затем запустите следующий код

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 
)