导入时跳过第一个数据行

Ker*_*mit 8 sql-server csv import

我正在使用XML格式文件导入CSV文件,并且第一个数据行被跳过.我无法弄清楚为什么.

格式文件

<?xml version="1.0"?>
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <RECORD>
  <FIELD ID="1" xsi:type="CharTerm" TERMINATOR='","' />
  <FIELD ID="2" xsi:type="CharTerm" TERMINATOR='\n' />
 </RECORD>
 <ROW>
  <COLUMN SOURCE="1" NAME="COLUMN1" xsi:type="SQLVARYCHAR" />
  <COLUMN SOURCE="2" NAME="COLUMN2" xsi:type="SQLVARYCHAR" />
 </ROW>
</BCPFORMAT>
Run Code Online (Sandbox Code Playgroud)

CSV

COLUMN1,COLUMN2
"ABC","ABC123456"
"TNT","TNT123456"
Run Code Online (Sandbox Code Playgroud)

询问

SELECT *
FROM OPENROWSET(BULK 'C:\sample.csv',
FORMATFILE='C:\sample.xml',
FIRSTROW = 2) AS a
Run Code Online (Sandbox Code Playgroud)

结果

COLUMN1 COLUMN2
------- ----------
"TNT    TNT123456"

(1 row(s) affected)
Run Code Online (Sandbox Code Playgroud)

如果FIRSTROW更改为1,结果将变为:

COLUMN1                COLUMN2
---------------------  ----------
COLUMN1,COLUMN2  "ABC  ABC123456" 
"TNT                   TNT123456"
Run Code Online (Sandbox Code Playgroud)

如果标题行已从CSV中删除并FIRSTROW更改为1,则结果将按预期返回:

COLUMN1 COLUMN2
------- ----------
"ABC    ABC123456" 
"TNT    TNT123456"
Run Code Online (Sandbox Code Playgroud)

由于这是一个带有标题的自动报告,是否还有其他选项可以解决这个问题?

Aar*_*and 3

这里有几个问题:

  1. \n我怀疑第一行没有有效的。否则,当您更改为 时,SQL Server 不会修改前两行FIRSTROW = 1

  2. 用作","列分隔符对于除第一列和最后一列之外的所有列都非常有效。"这会在第一列上留下前导,并"在最后一列上留下尾随。ROWTERMINATOR您可以通过更改to来处理后者"\n,但这只有在您还可以"向标题行添加尾随时才有效(在确保那里有效的过程中\n)。此时,您不妨确保标题行在所有方面都与数据行匹配,因此:

    "COLUMN1","COLUMN2"
    -------------------^ this character has to be \n
    
    Run Code Online (Sandbox Code Playgroud)

老实说,我认为您可以花一周的时间来解决所有这些细节BCPBULK INSERT问题,但仍然没有一个不需要后期操作的完美解决方案(例如修剪"某些列中的前导/尾随字符) 。"我的建议:花 20 分钟用 C# 编写一个解析器,它会在 SQL Server 看到文件之前自动更正这些文件 - 删除标题行、确保正确的分隔符就位、删除所有愚蠢的等。清理文件比你现在要跳过的麻烦要少得多。我确信这个问题有解决方案,但 IIRC 你已经为此奋斗了相当长一段时间......