2012-02-23 3 views
1

Я получаю ежедневный CSV с дублирующимися записями. Я попытался импортировать его с помощью BULK INSERT, но мое ограничение первичного ключа выдает мне ошибку из-за дубликатов.Импорт отдельных записей в SQL Server 2008

Чтобы исправить это, я имею в виду импортировать данные в новую таблицу, без ограничения первичного ключа, а затем, используя следующий код:

INSERT INTO final_table(col1, col2, col3) 
SELECT DISTINCT col1, col2, col3 
FROM temporary_table 

Это лучший способ идти об этом? Или есть ли более простой способ сделать это в SQL Server 2008?

+0

Что бы вы хотели сделать с дубликатами? удалить их или игнорировать их? –

+0

Я бы предложил BCP'у их на стол с индексом, а затем добавив индекс с IGNORE_DUP_KEY, установленным соответственно –

+0

. Я бы хотел полностью удалить их. Метод промежуточной таблицы, похоже, работает до сих пор. Благодаря! – eek142

ответ

2

Эта «новая» таблица называется промежуточной таблицей. У него должно быть очень мало ограничений ... т.е. ограничения. Как только вы загрузите его, вы вычистите и загрузите в свою «финальную» таблицу.

Я думаю, что то, что вы предлагаете сделать, является самым простым. Если вы не используете SSIS, и вы непреклонны в том, что не используете промежуточную таблицу. Мне обычно нравится иметь промежуточную таблицу, поэтому я могу видеть точную копию файла, если что-то пойдет не так. Помогает с устранением неполадок.

+0

Столбец должен быть реальной таблицей, или я могу использовать временную таблицу? – eek142

+0

хорошо, технически таблицы #tmp - это таблицы, находящиеся в tempdb. Однако это зависит от сеанса, поэтому вы можете «создать таблицу #tmp» перед загрузкой. –

+0

Мне вообще нравится иметь промежуточную таблицу, которая сохраняется в моем процессе ETL. Просто у меня есть доступ к необработанным данным. Однако в этом случае это не имеет значения, поскольку вы просто пытаетесь избавиться от дубликатов. –

1

Попробуйте это:

INSERT INTO final_table 
SELECT DISTINCT csv.* 
FROM OPENROWSET(BULK N'C:\Text1.csv', SINGLE_CLOB) AS csv 
+0

Я получаю следующую ошибку: Список выбора для оператора INSERT содержит меньше элементов, чем список вставки. Количество значений SELECT должно соответствовать количеству столбцов INSERT. То есть, когда я пытаюсь запустить следующий код:. INSERT INTO final_table (col1, col2, col3) SELECT DISTINCT CSV * FROM OPENROWSET (BULK N'C: \ Text1.csv», SINGLE_CLOB) AS CSV Должен ли я упоминать разделитель запятой где-то для CSV? – eek142

+0

Я написал код так, как вы понимаете, вам нужно указать столбцы в элементе, который соответствует определению таблицы final_table. – pistipanko

+0

Как определить столбцы в таблице «csv»? Не вставляем ли мы непосредственно из файла? Я указал столбцы для final_table, такие как final_table (col1, col2, col3) – eek142

Смежные вопросы