为啥在 MS SQL Server 中批量插入时出现“XML 解析:第 2 行,字符 0,文档语法不正确”

Posted

技术标签:

【中文标题】为啥在 MS SQL Server 中批量插入时出现“XML 解析:第 2 行,字符 0,文档语法不正确”【英文标题】:Why do I get "XML parsing: line 2, character 0, incorrect document syntax" when Bulk Inserting in MS SQL Server为什么在 MS SQL Server 中批量插入时出现“XML 解析:第 2 行,字符 0,文档语法不正确” 【发布时间】:2011-01-10 09:50:46 【问题描述】:

我正在使用 FMT 格式文件对表进行 BULK INSERT,但出现以下错误:

XML parsing: line 2, character 0, incorrect document syntax

这是我的代码

BULK INSERT [DM_Flux].[dbo].[Stage] FROM 'C:\temp\data.dat'
WITH (FORMATFILE = 'C:\temp\FormatBcp.fmt')

这是格式文件(标准格式文件,不是 XML):

10.0
5
1   SQLCHAR 0   2   ""  1   Id  ""
2   SQLCHAR 0   40  ""  2   Name    ""
3   SQLCHAR 0   50  ""  3   Street  ""
4   SQLCHAR 0   8   ""  4   StreetNo    ""
5   SQLCHAR 0   300 "\r\n"  7   BulkData    ""

为什么我会收到 XML 错误?

【问题讨论】:

【参考方案1】:

确保 MS SQL 服务器不会无法读取版本格式的好方法是降级 .FMT 文件中的版本号。将 V10.0 更改为 9.0 或更低版本。 MS SQL 2008 可以读取较低版本,但 2005 无法读取较高版本。所以降级版本号可能有助于解决问题。

bcp 实用程序的版本号:

 9.0 = SQL Server 2005 
10.0 = SQL Server 2008
11.0 = SQL Server 2012
12.0 = SQL Server 2014

非 XML 格式的文件可以参考微软页面:http://msdn.microsoft.com/en-us/library/ms191479.aspx。

【讨论】:

【参考方案2】:

还有一点,以防万一其他人遇到这种情况......

如果您确定文件是 ANSI 但仍然收到此错误,请检查格式文件的第一行(版本号)。版本号必须与您的 SQL 版本号匹配(或为旧版本号)。

MSDN reference:

用于读取格式文件的 bcp 实用程序 (Bcp.exe) 版本必须与用于创建格式文件的版本相同或更高。例如,SQL Server 2008 bcp 可以读取 SQL Server 2005 bcp 生成的 9.0 版格式文件,但 SQL Server 2005 bcp 无法读取 SQL Server 2008 bcp 生成的 10.0 版格式文件。

【讨论】:

【参考方案3】:

如果格式文件被编码为 Unicode,批量插入将自动认为它是一个 XML 文件并将其视为 XML 文件。确保文件被编码为 ANSI,你应该没问题。

【讨论】:

交叉。确实!它终于奏效了。 @inon:在 Notepad++ 中打开格式文件并通过编码菜单更改为 ANSI。实际上,我首先创建了一个新的空白文件,然后更改了编码,然后从旧格式文件中粘贴了以前的内容。 xml 错误消失了。

以上是关于为啥在 MS SQL Server 中批量插入时出现“XML 解析:第 2 行,字符 0,文档语法不正确”的主要内容,如果未能解决你的问题,请参考以下文章

尝试将数据表批量插入 SQL Server 时出现 InvalidOperationException

MS SQL 批量更新\插入

在 SQL Server CE 中批量插入

MS-SQL 2012 中的 C# Dapper 加载程序在插入时出现死锁

JPA SQL Server 批量插入

为啥在将 bigint 数插入 bigint 列时出现算术溢出错误?