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

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

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

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

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

Ответы

Ответ 1

Ссылка на 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')

Ответ 2

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

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

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

У меня не было проблем с драйвером Access.

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

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

alter table CsvImportTable add Id int identity(1, 1)

Ответ 3

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

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

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