使用Openrowset导入错误

时间:2017-01-26 21:53:16

标签: sql sql-server sql-server-2008 tsql csv

我正在尝试使用数字和字母数字值导入列(来自.csv文件),但是当我运行openrowset过程时,它会正确导入数字行,但对于字母数字值,它默认为null

表A

ID,A,B,C
1,12,hh,i
2,ab12,tt,b
3,2,aa,o
4,bc12,ee,l

使用的代码

SELECT 
    * 
FROM 
    OPENROWSET
        (
            'Microsoft.ACE.OLEDB.12.0','Text;Database=C:\;IMEX=1;','SELECT * FROM abc.csv'
        ) t

我使用了IMEX =1而没有任何变化。

2 个答案:

答案 0 :(得分:7)

问题原因是Oledb提供商

导入具有混合数据类型列的csv文件或excel文件时,它将用null替换非显性类型。 (使用Oledb或Ace.Oledb

<强>变通方法

你可以通过添加包含字符串值的第一行然后在impirting完成后删除它来做一些解决方法

ID,A,B,C
0,a,a,a
1,12,hh,i
2,ab12,tt,b
3,2,aa,o
4,bc12,ee,l

如果使用IMEX=1

,它将解决问题

这会将列读取为字符串,将ID列作为数字读取。 (使用0)

或者将HDR=NO属性添加到连接字符串,以便标题是导入的第一行(其所有值都是字符串)

详细了解此article

中有关混合数据类型的信息

其他方法

或者尝试在没有aceoledb提供程序的情况下实现此目的,只需以下列其他方式导入csv文件:

使用Microsoft文本驱动程序

SELECT * FROM OPENROWSET('MSDASQL',
'Driver={Microsoft Text Driver (*.txt; *.csv)};
DefaultDir=C:\;',
'SELECT * FROM abc.csv')

使用BULK INSERT

CREATE TABLE dbo.MyTable 
(ID INTEGER,
 A VARCHAR(50),
 B VARCHAR(50),
 C VARCHAR(50)
)

BULK INSERT dbo.MyTable
FROM 'C:\abc.csv'
WITH 
  (
    FIELDTERMINATOR = ',', 
    ROWTERMINATOR = '\n' 
  )

这些文章中的其他细节:

答案 1 :(得分:4)

以下示例应该有效。请注意,在我的系统上,我无法使用您使用的提供程序(因为我有一段时间没有安装它,并确定安装什么让我发疯。)关键部分:您需要一个格式文件来告诉SQL服务器每列中的预期值。这是一篇很好的博文 using csv in your queries  我无法粘贴XMl,因为版本可能会因您的数据库而异:

创建xml文件的最简单方法是:

1)在数据库中创建一个表。你不会插入这个。它只允许你让下一个命令创建表:

CREATE TABLE dbo.TestInsert 
(ID INTEGER,
 A VARCHAR(10),
 B VARCHAR(10),
 C VARCHAR(10)
)

2)接下来,运行以下命令行bcp程序以生成相应的文件:

bcp YourDatabase.dbo.TestInsert format nul -c -x -fimport.xml -t, -T

3)最后,使用import.xml作为格式文件。

SELECT 
  * 
FROM 
   OPENROWSET
    (
        BULK 'c:\test.csv', 
        FORMATFILE='c:\import.xml',
        FIRSTROW=2
    ) t