使用格式化文件在SQL中大容量插入csv以删除双引号

使用格式化文件在SQL中大容量插入csv以删除双引号,sql,sql-server,csv,bulkinsert,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

我有以下格式的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
其中,第三行Timestamp是带有双引号的项

尝试在大容量插入中使用此文件会导致错误消息

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

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

这是否可行:

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

您的无效列号错误可能是由于在目标字段号中重复列号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列的delimter实际上是,“第3列的分隔符(时间戳)是”

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

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

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

Field1Name,Field2Name,"Timestamp",Field3Name ...

完成批量插入后,通过SQL删除引号

不,我试过那种变化。我得到“无法大容量加载,因为无法读取文件。操作系统错误代码(null)”