Mel*_*lie 3 sql sql-server csv bulkinsert
我有一个CSV文件,格式如下:
data, data, "timestamp", data, data, data, data, data
Run Code Online (Sandbox Code Playgroud)
我需要从时间戳数据周围删除双引号,然后将其作为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
Run Code Online (Sandbox Code Playgroud)
第三行,Timestamp,是带有双引号的项目.
尝试在批量插入中使用此文件会导致出现错误消息
消息4823,级别16,状态1,行2无法批量加载.格式文件中的列号无效.
有没有办法可以改变格式文件来做我需要的东西?我正在使用MSSQL.
那么您的无效列号错误可能是由于在目标字段编号中重复了第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
Run Code Online (Sandbox Code Playgroud)
因此,对于第2列的分隔符,实际上,"并且您的第3列(时间戳)的分隔符是", - "从数据中删除,因为它是分隔符的一部分.
注意:如果您的第一行中有列标题,这将无法正常工作,即如果您的第一行包含列标题,如...
Field1Name,Field2Name,Timestamp,Field3Name ...
Run Code Online (Sandbox Code Playgroud)
然后上面的分隔符将不适用于此行,因为列标题Timestamp周围没有引号.结果是第一行在第1列和第2列中具有正确的数据,但第3行在第1行(",")中没有有效的分隔符,因此它包含所有其余列标题和前3列第2行的字段,直到它最终在第2行的第3列找到正确的分隔符(",").然后第2行的其余部分出现在后面的列中.一团糟.而你无法通过使用来绕过它
FIRSTROW = 2
Run Code Online (Sandbox Code Playgroud)
您必须删除标题行,或在第3列标题周围添加引号 -
Field1Name,Field2Name,"Timestamp",Field3Name ...
Run Code Online (Sandbox Code Playgroud)
完成批量插入后,或通过SQL删除引号.