OpenRowset - Как прочитать все как текст?
-
26-10-2019 - |
Вопрос
Я использую следующую команду для загрузки данных в 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';