2017-01-26 2 views
3

Я пытаюсь импортировать столбец (из CSV-файла) с числовыми и буквенно-цифровыми значениями, но когда я запускаю процедуру openrowset, он импортирует числовые строки правильно, но для буквенно-цифровых значений по умолчанию он равен null.Ошибка импорта с использованием Openrowset

Таблица A

ID,A,B,C 
1,12,hh,i 
2,ab12,tt,b 
3,2,aa,o 
4,bc12,ee,l 

Код, используемый

SELECT 
    * 
FROM 
    OPENROWSET 
     (
      'Microsoft.ACE.OLEDB.12.0','Text;Database=C:\;IMEX=1;','SELECT * FROM abc.csv' 
     ) t 

я использовал IMEX =1 и вообще никаких изменений.

+1

Почему бы не принять ответ, если он на 100% правильный? –

ответ

7

Проблема причина является поставщиком OLEDB

При импорте файла CSV или Excel файлов со смешанными типами данных столбца она заменит не являющиеся доминирующие типы по null. (Использование OLEDB или Ace.Oledb)

Обходные

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

ID,A,B,C 
0,a,a,a 
1,12,hh,i 
2,ab12,tt,b 
3,2,aa,o 
4,bc12,ee,l 

И он исправит проблему, если используется IMEX=1

Это будет считать столбцы в качестве столбца строки и идентификатора в качестве номера. (0 используется)

Или добавить HDR=NO свойства строки соединения, так что заголовок является первой линией импортируется (все его значениями являются строками)

Подробнее о смешанных типах данных в этом article

Другого методы

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

Использование Microsoft Text Driver

SELECT * FROM OPENROWSET('MSDASQL', 
'Driver={Microsoft Text Driver (*.txt; *.csv)}; 
DefaultDir=C:\;', 
'SELECT * FROM abc.csv') 

Использование BULK INSERT

CREATE TABLE dbo.MyTable 
(ID INTEGER, 
A VARCHAR(50), 
B VARCHAR(50), 
C VARCHAR(50) 
) 

BULK INSERT dbo.MyTable 
FROM 'C:\abc.csv' 
WITH 
    (
    FIELDTERMINATOR = ',', 
    ROWTERMINATOR = '\n' 
) 

Другие подробности в этих статьях:

+0

Я хочу автоматизировать процесс каждый раз, когда открытие записи и сохранение не является возможным вариантом. – Zack

+0

@zack прочитать статью, которую я предоставил, я думаю, что это то, что ищут ur – Hadi

+0

Я отредактировал мой ответ – Hadi

4

Приведенный ниже пример должен работать.Обратите внимание: в моей системе я не мог использовать используемого вами провайдера (потому что я не устанавливал это через некоторое время и выяснял, что устанавливать, сводит меня с ума). Основная часть: вам нужен файл формата, чтобы сообщить SQL сервер ожидаемых значений в каждом столбце. Вот хороший сообщение в блоге using csv in your queries Я не могу вставить Xml как вариант может варьироваться в зависимости от вашей базы данных:

Самый простой способ для создания файла XML является:

1) Создать таблицу в базы данных. Вы не будете вставлять это. Это просто позволит вам иметь следующую команду создает таблицу:

CREATE TABLE dbo.TestInsert 
(ID INTEGER, 
A VARCHAR(10), 
B VARCHAR(10), 
C VARCHAR(10) 
) 

2) Затем запустите следующую программу из командной строки BCP для создания соответствующего файла:

bcp YourDatabase.dbo.TestInsert format nul -c -x -fimport.xml -t, -T 

3) Наконец, использование import.xml в качестве файла формата.

SELECT 
    * 
FROM 
    OPENROWSET 
    (
     BULK 'c:\test.csv', 
     FORMATFILE='c:\import.xml', 
     FIRSTROW=2 
    ) t 
Смежные вопросы