Вопрос

Я использую следующую команду для загрузки данных в SQL Server:

INSERT INTO [NewTable]

SELECT * FROM OPENROWSET 
(
'MSDASQL', 'Driver={Microsoft Text Driver (*.txt; *.csv)};DBQ=c:\SomeFolder\;'
, 'SELECT * from [SomeFile.csv]'
);

Проблема заключается в том, что, по -видимому, драйвер пытается угадать дат данных для каждого поля, и где состав не работает, он просто читается в нуле. Например, допустим, у меня есть следующее

SomeCode   SomeName
100        A
299        B
22         C
123        D
ABC        E
900        F

Похоже, что «что -то» является целым числом, и он будет читать «ABC» как NULL. Есть ли способ, которым я могу остановить это. Все, что я хочу, это обрабатывать данные как варчарс на протяжении всего пути.

Любые идеи?

Это было полезно?

Решение

Взгляни на Вторая ссылка в моем ответе по этому вопросу о ключах реестра, которые контролируют, как типы самолетов проводят.

Вы также можете убедиться, что клавиша importmixedTypes установлен на текст.

HKLM\Software\Microsoft\Jet\4.0\Engines\Excel\ImportMixedTypes

Вам, возможно, придется заменить что -то еще на Excel, Однако.

Другие советы

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

Подробности о том, как отформатировать ваш FORMATFILE При чтении текстовых файлов. http://msdn.microsoft.com/en-us/library/ms191175.aspx

В твоем случае:

Сделайте formatfile.xml, содержащий:

<?xml version="1.0"?>
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <RECORD>
  <FIELD ID="1" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="100" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
  <FIELD ID="2" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="100" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
 </RECORD>
 <ROW>
  <COLUMN SOURCE="1" NAME="Col1" xsi:type="SQLNVARCHAR"/>
  <COLUMN SOURCE="2" NAME="Col2" xsi:type="SQLNVARCHAR"/>
 </ROW>
</BCPFORMAT>

Измените свой запрос на:

BULK INSERT [newTable]
FROM 'C:\somefile.csv' 
WITH (formatfile='C:\formatfile.xml');

Мне потребовалось некоторое время, чтобы найти то, что я искал, так что добавление здесь, так как это один из лучших результатов:

Если вы используете microsoft.ace.oledb и у вас есть эта проблема, вам необходимо добавить опцию «imex = 1;» (Без кавычек) к источнику данных.

Пример:

SELECT * INTO #temp FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0','Excel 12.0 Xml;HDR=YES;IMEX=1;Database=P:\Data\FileName.xlsx' ,'SELECT * FROM [Sheet1$A1:BB100]')

Это будет читать смешанные данные как текст. Надеюсь это поможет.

Дорожка для решения этой проблемы состоит в том, чтобы использовать «hdr = no». В этом случае, из -за заголовка DatatType (текст) значение по умолчанию столбцов, которое будет текстом. В конце вы можете просто отфильтровать строку заголовка. в твоем случае:

INSERT INTO [NewTable]

SELECT * FROM OPENROWSET 
(
'MSDASQL', 'Driver={Microsoft Text Driver (*.txt; *.csv)};DBQ=c:\SomeFolder\;'
;HDR=Noe, 'SELECT * from [SomeFile.csv]'
)where [F1] <> 'SomeCode';
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top