使用formatfile在SQL中批量插入csv以删除双引号

时间:2012-11-27 17:07:22

标签: sql sql-server csv bulkinsert

我有以下格式的CSV文件:

data, data, "timestamp", data, data, data, data, data

我需要从时间戳数据周围删除双引号,然后将其作为DATETIME数据类型插入表中。

在研究了格式文件后,我想出了这个:

10.0
8
1   SQLCHAR 0   12  ","     1   Data        SQL_Latin1_General_CP1_CI_AS
2   SQLCHAR 0   12  ","     2   Data        SQL_Latin1_General_CP1_CI_AS
3   SQLCHAR 0   26  "",""   3   Timestamp   SQL_Latin1_General_CP1_CI_AS
4   SQLCHAR 0   41  ","     4   Data        SQL_Latin1_General_CP1_CI_AS
5   SQLCHAR 0   41  ","     5   Data        SQL_Latin1_General_CP1_CI_AS
6   SQLCHAR 0   41  ","     6   Data        SQL_Latin1_General_CP1_CI_AS
7   SQLCHAR 0   5   ","     7   Data        SQL_Latin1_General_CP1_CI_AS
8   SQLCHAR 0   12  "0x0a"  6   Data        SQL_Latin1_General_CP1_CI_AS

其中第3行Timestamp是围绕它的双引号的项目。

尝试在批量插入中使用此文件会导致出现错误消息

  

消息4823,级别16,状态1,行2无法批量加载。列无效   格式文件中的数字。

有没有办法可以改变格式文件以满足我的需要? 我正在使用MSSQL。

2 个答案:

答案 0 :(得分:5)

您的无效列号错误可能是由于在目标字段编号中重复了第6列而不是第8列而导致的。

但是要删除“”,你需要在第2列和第3列的分隔符中使用\“,就像这样......

SQLCHAR 0   12  ","     1   Data        SQL_Latin1_General_CP1_CI_AS
SQLCHAR 0   12  ",\""   2   Data        SQL_Latin1_General_CP1_CI_AS
SQLCHAR 0   26  "\","   3   Timestamp   SQL_Latin1_General_CP1_CI_AS
SQLCHAR 0   41  ","     4   Data        SQL_Latin1_General_CP1_CI_AS
SQLCHAR 0   41  ","     5   Data        SQL_Latin1_General_CP1_CI_AS
SQLCHAR 0   41  ","     6   Data        SQL_Latin1_General_CP1_CI_AS
SQLCHAR 0   5   ","     7   Data        SQL_Latin1_General_CP1_CI_AS
SQLCHAR 0   12  "\r\n"  6   Data        SQL_Latin1_General_CP1_CI_AS

-- note: use \r\n for row terminator for an Excel file saved as CSV

所以对于第2列的分隔符实际上是,“并且第3列(时间戳)的分隔符是”, - “从数据中删除,因为它是分隔符的一部分。

注意:如果您的第一行中有列标题,这将无法正常工作,即如果您的第一行包含列标题,例如...

Field1Name,Field2Name,Timestamp,Field3Name ...

然后上面的分隔符将不适用于此行,因为列标题Timestamp周围没有引号。结果是第一行在第1列和第2列中具有正确的数据,但第3行在第1行(“,”)中没有有效的分隔符,因此它包含所有其余列标题和前3列第2行的字段,直到它最终在第2行的第3列找到正确的分隔符(“,”)。然后第2行的其余部分出现在后面的列中。一团糟。你无法通过使用

来解决它
FIRSTROW = 2

您必须删除标题行,在第3列标题周围添加引号 -

Field1Name,Field2Name,"Timestamp",Field3Name ...
完成批量插入后,

通过SQL删除引号。

答案 1 :(得分:0)

这会有效吗?

SQLCHAR 0   12  ","     1   Data        SQL_Latin1_General_CP1_CI_AS
SQLCHAR 0   12  ","     2   Data        SQL_Latin1_General_CP1_CI_AS
SQLCHAR 0   26  '","'   3   Timestamp   SQL_Latin1_General_CP1_CI_AS
SQLCHAR 0   41  ","     4   Data        SQL_Latin1_General_CP1_CI_AS
SQLCHAR 0   41  ","     5   Data        SQL_Latin1_General_CP1_CI_AS
SQLCHAR 0   41  ","     6   Data        SQL_Latin1_General_CP1_CI_AS
SQLCHAR 0   5   ","     7   Data        SQL_Latin1_General_CP1_CI_AS
SQLCHAR 0   12  "0x0a"  6   Data        SQL_Latin1_General_CP1_CI_AS