我使用以下命令将数据加载到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一直处理。
有什么想法吗?
答案 0 :(得分:3)
查看the second link in my answer on this question有关控制JET推断类型的注册表项的信息。
您可能还想确保将ImportMixedTypes键设置为Text。
HKLM\Software\Microsoft\Jet\4.0\Engines\Excel\ImportMixedTypes
但是,您可能必须用其他内容替换Excel
。
答案 1 :(得分: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');
答案 2 :(得分: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]')
这将以文本形式读取混合数据。 希望这会有所帮助。
答案 3 :(得分:0)
解决此问题的捷径是使用“ HDR =否”。 在这种情况下,由于标题为datatType(Text),所以whoud列的默认值为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';