SQL Server 2008中的CSV导入

时间:2010-08-19 20:51:15

标签: sql-server sql-server-2008

我有一个csv文件,其列值用双引号括起来。

我想使用sql语句从网络路径导入csv文件。

我尝试了批量插入。但它随双引号一起进口。有没有其他方法可以通过忽略文本限定符双引号使用sql语句将csv文件导入SQL Server 2008?

由于 -Vivek

3 个答案:

答案 0 :(得分:3)

您可以使用non-xml format file为每列指定不同的分隔符。对于用双引号括起来并由制表符分隔的值,分隔符可以是\",\"。您必须添加一个初始未使用的列来捕获第一个引用。例如,要读取此文件:

"row1col1","row1col2","row1col3"
"row2col1","row2col2","row2col3"
"row3col1","row3col2","row3col3"

您可以使用此格式文件:

10.0
4
1  SQLCHAR 0 50 "\""     0 unused ""
2  SQLCHAR 0 50 "\",\""  1 col1   ""
3  SQLCHAR 0 50 "\",\""  2 col2   ""
4  SQLCHAR 0 50 "\"\r\n" 3 col3   ""

(第一行的数字取决于SQL Server版本。第二行的数字是要读取的列数。不要忘记调整。)

bulk insert命令接受formatfile = 'format_file_path'参数,您可以在其中指定格式文件。例如:

BULK INSERT YourTable
FROM 'c:\test\test.csv'
WITH (FORMATFILE = 'c:\test\test.cfmt')

这导致:

select * from YourTable
-->
col1        col2        col3
row1col1    row1col2    row1col3
row2col1    row2col2    row2col3
row3col1    row3col2    row3col3

答案 1 :(得分:2)

导入带有文本分隔符的文件时,这是一个已知问题,因为bcp / bulk insert实用程序不允许您指定文本分隔符。有关详细讨论,请参阅this link

答案 2 :(得分:0)

@ Andomar的anaswer让我99%的路上有一个非常相似的问题。但是,我发现SQL Server 2014无法导入最后一行,因为最后一个字段没有新行字符:\r\n。 所以我的格式文件看起来更像是:

12.0
4
1   SQLCHAR 0   50  "\""    0   unused  ""
2   SQLCHAR 0   50  "\",\"" 1   col1    ""
3   SQLCHAR 0   50  "\",\"" 2   col2    ""
4   SQLCHAR 0   50  "\""    3   col3    ""

因此对于我的文件,其中包含一个带字段名称的行,导入SQL变为:

BULK INSERT MyTable
FROM 'C:\mypath\datafile.csv'
WITH (
    FIRSTROW = 2,
    FORMATFILE = 'C:\mypath\formatfile.cfmt',
    ROWTERMINATOR = '\r\n'
)

实际的CSV有40个字段,因此在Microsoft's website上阅读没有必要编写列名称(col1 - col40工作得很好)以及每行中的第四个参数 - 示例中的50,只需要是最大字段长度,而不是精确的。