3

我正在使用以下命令将数据加载到 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

似乎认为“SomeCode”是一个整数,它会将“ABC”读作 NULL。有什么办法可以阻止这种情况发生。我想要的只是将数据一直作为 varchars 处理。

有任何想法吗?

4

4 回答 4

3

看看我对这个问题的回答中的第二个链接,关于控制 JET 如何推断类型的注册表项。

您可能还需要确保 ImportMixedTypes 键设置为 Text。

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

但是,您可能必须用其他东西代替Excel

于 2012-01-10T12:06:25.167 回答
2

它只会扫描几行以确定最可能的数据类型。在像您这样的场景中,这是一个问题。但是,您可以将格式文件与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');
于 2012-01-10T12:03:29.867 回答
1

我花了一段时间才找到我要找的东西,所以在这里添加它,因为这是最好的结果之一:

如果您使用 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]')

这会将混合数据读取为文本。希望这可以帮助。

于 2016-11-21T23:14:58.380 回答
0

解决这个问题的捷径是使用“HDR=No”。在这种情况下,由于标题 datatType (Text),列的默认值应该是文本。最后,您可以简单地过滤标题行。在你的情况下:

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';
于 2019-07-03T13:17:12.897 回答