Как создать и заполнить таблицу за один шаг в рамках операции импорта CSV?

Я ищу простой способ импортировать файлы CSV в SQL Server без предварительного создания таблицы и определения ее столбцов.

Каждый импортированный CSV будет импортирован в отдельную таблицу.

Нас не беспокоит определение типа данных. CSV различаются по структуре и макету, и все они содержат много столбцов, но нас интересуют только некоторые из них: почтовые адреса и почтовые индексы. Мы просто хотим быстро загрузить данные CSV в базу данных SQL и извлечь соответствующие столбцы.

Я хотел бы предоставить FieldTerminator и RowTerminator, указать их на CSV, а все остальное сделать утилита. Есть ли способ создать таблицу и заполнить ее за один шаг с помощью BULK INSERT и / или OpenRowset (BULK ...)?


person Tim    schedule 02.05.2012    source источник


Ответы (3)


Ссылаясь на SQLServerPedia, я думаю, что это сработает:

sp_configure 'show advanced options', 1;
RECONFIGURE;
GO
sp_configure 'Ad Hoc Distributed Queries', 1;
RECONFIGURE;
GO

select TerritoryID
      ,TotalSales
      ,TotalCost
INTO CSVImportTable
from openrowset('MSDASQL'
               ,'Driver={Microsoft Access Text Driver (*.txt, *.csv)}'
               ,'select * from C:\csvtest.CSV')
person TyT    schedule 02.05.2012
comment
Спасибо. Мне пришлось использовать Microsoft Text Driver вместо Microsoft Access Text Driver, но импорт работал. Однако я получил это сообщение об ошибке (хотя импорт работал, несмотря на это): Msg 15123, Level 16, State 1, Procedure sp_configure, Line 79 Параметр конфигурации «Ad Hoc Distributed Queries» не существует, или это может быть расширенный параметр. . - person Tim; 03.05.2012
comment
Вы должны запустить «RECONFIGURE» для расширенных опций, прежде чем вы сможете настроить специальную опцию. После первой ПЕРЕКОНФИГУРАЦИИ должен быть еще один GO. Перередактирую. - person TyT; 03.05.2012

Раздражает, у меня пока нет репутации, чтобы просто прокомментировать, поэтому я добавлю ответ, основанный на TyT (этот дескриптор выглядит ужасно в собственническом смысле, кстати ...)

Рабочий код нуждался в двойном «\» вместо одиночного, чтобы избежать ошибки «файл не найден». И вам не нужно указывать поля; они будут выведены из первой строки файла:

select *
into   CsvImportTable
from   openrowset(
           'MSDASQL',
           'Driver={Microsoft Access Text Driver (*.txt, *.csv)}',
           'select * from C:\\csvtestfile.csv')

С драйвером Access проблем не было.

ОБНОВЛЕНИЕ: если у вас возникли проблемы с неправильным выводом типов, вставьте несколько строк вверху файла с данными того типа, который вы хотите в таблице, чтобы вы получили, скажем, текст -> VARCHAR вместо текста-> INT, а затем удалите эти строки после импорта.

В качестве финальной глазури добавьте PK в таблицу, чтобы вы могли манипулировать данными - удалить фиктивные строки и т. Д.:

alter table CsvImportTable add Id int identity(1, 1)
person SteveCinq    schedule 02.02.2016
comment
Для чего стоит добавить детали в свой профиль. Ваши очки репутации увеличиваются. - person Mark Schultheiss; 01.05.2017

Обновленный ответ, если вы используете SQL Server Management Studio 17.

Щелкните правой кнопкой мыши База данных -> Задачи -> Импортировать плоский файл ...

Он автоматически определит первую строку данных в качестве имен столбцов. Он должен автоматически подбирать терминаторы. Вы получите возможность установить первичные ключи, разрешая нули, а также указать типы данных для столбцов.

person Datanova Scientific    schedule 25.09.2019