【发布时间】:2021-05-07 23:59:40
【问题描述】:
我正在尝试创建一个审核传入 XML 数据馈送的报告。 我们根据系统中的信息验证传入交易,仅当交易与有效记录上的某些数据点匹配时才插入交易数据。
我的报告查看所有未通过此验证的近期传入交易,然后尝试从每笔交易中读取一些数据,以便我们可以手动检查问题并要求我们的供应商更正信息并重新发送。
有时,我们会得到一些无效的 xml。有时它被截断,有时它缺少标签等。 当 xml 有效时,我的报告工作正常,但是当遇到带有无效 xml 的事务时,查询完全出错。
我需要升级我的代码,以便整个查询在遇到无效 xml 时不会出错。 理想情况下,当遇到无效的 xml 时,它会通过将所有列拉为“NULL”来处理这个问题,或者更好的是,拉入 xml 的好的部分(正确关闭的标签)。
通常我得到:“XML 解析:第 9 行,字符 0,输入意外结束”
这是我查询的当前结构的模型(注意第二个 XML 文件无效/被截断):
DECLARE @mockup TABLE(ID INT, xmlcontent XML);
INSERT INTO @mockup VALUES
(1, '
<Movie>
<MovieID>1234</MovieID>
<MovieName>Mission Impossible</MovieName>
<Character>
<FirstName>Ethan</FirstName>
<LastName>Hunt</LastName>
</Character>
</Movie>'),
(2,'
<Movie>
<MovieID>5678</MovieID>
<MovieName>Casino Royale</MovieName>
<Character>
<FirstName>James</FirstName>
<LastName>Bond</LastName>
')
SELECT
ID,
allnodes.value('(MovieID)[1]','nvarchar(100)') as MovieID,
allnodes.value('(MovieName)[1]','nvarchar(100)') as MovieName,
allnodes.value('(Character/FirstName)[1]','nvarchar(100)') as FirstName,
allnodes.value('(Character/LastName)[1]','nvarchar(100)') as LastName
FROM @mockup mockup
--Get all the transaction data:
CROSS APPLY mockup.xmlcontent.nodes('Movie') as xmldata(allnodes)
【问题讨论】: