OPENROWSET - 如何以文本形式阅读所有内容?

时间:2012-01-10 11:58:43

标签: sql sql-server sql-server-2008 openrowset

我使用以下命令将数据加载到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 个答案:

答案 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';