批量插入无法忽略 XML 文件中的错误?

Bulk Insert Cannot Ignore Errors in XML file?

我创建了一个名为 XML 的 table 表,其中一列名为 XMLCol,数据类型为 xml。

然后我尝试使用 SQL 服务器批量插入将数据插入 table:

BULK INSERT [XMLTable] FROM 'F:\mydata.dat' WITH (DATAFILETYPE = 'widechar', FORMATFILE = 'F:\myformat.XML', MAXERRORS = 2147483647, ROWS_PER_BATCH = 1, TABLOCK);

我将 MAXERRORS 设置为 2147483647,这样当 XML 数据中遇到任何错误时,批量插入将忽略错误并继续插入剩余记录。

我的格式文件(myformat.xml)是:

<?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="NCharTerm" TERMINATOR="\x2C\x00"/>
 </RECORD>
 <ROW>
  <COLUMN SOURCE="1" xsi:type="SQLNVARCHAR" NULLABLE="YES"/>
 </ROW>
</BCPFORMAT>

我的数据文件(mydata.dat)是:

如您所见,数据文件中有两条记录。我通过将“/”更改为 0 来修改第一个,使其无效。第二条记录是有效的 XML.

当我批量插入数据时,会出现以下错误:

Msg 9455, Level 16, State 1, Line 1
XML parsing: line 1, character 5, illegal qualified name character

错误是预料之中的,因为我有意修改了数据文件。但是,即使我将 MAXERROR 指定为 2147483647,BULK INSERT 也不会忽略错误并插入第二条记录,为什么?

根据 https://docs.microsoft.com/en-us/sql/t-sql/statements/bulk-insert-transact-sql?view=sql-server-ver15 的 MS 官方文档,它说 "MAXERRORS = max_errors Specifies the maximum number of syntax errors allowed in the data before the bulk-import operation is canceled. Each row that cannot be imported by the bulk-import operation is ignored and counted as one error. If max_errors is not specified, the default is 10."。那为什么只有一个错误导致整个BULK INSERT失败呢?

您可以尝试使用以下方法。 (1) 您的目标数据库 table 将使用 NVARCHAR(MAX) 数据类型来保存 XML。 (2) TRY_CAST() 将向您显示 XML 或看起来像 XML 的有问题的字符串。

这样 BULK INSERT 将始终正常工作而不会出现任何错误。如果格式不正确、包含错误字符或任何其他问题,您将能够解决问题 XML。

SQL

USE tempdb;
GO

DROP TABLE IF EXISTS XMLTable;

CREATE TABLE XMLTable(XMLData NVARCHAR(MAX));

BULK INSERT [XMLTable]
FROM 'e:\Temp\XMLBulkINSERT\Data.DAT'
WITH
(
    DATAFILETYPE = 'widechar',
    FORMATFILE = 'e:\Temp\XMLBulkINSERT\Data_FORMATFILE.xml',
    MAXERRORS = 2147483647,
    ROWS_PER_BATCH = 12,
    TABLOCK
);

SELECT *
   , TRY_CAST(XMLData AS XML) AS RealXML
FROM dbo.XMLTable;