如何修复解析为SQL时XML文档错误中仅允许一个顶级元素

时间:2019-07-07 05:07:27

标签: sql sql-server xml

我正在尝试构造一个SQL事务,该事务将XML文件导入SQL服务器。但是,在执行此操作时出现此错误:

  

XML解析错误0xc00ce555发生在第1行,靠近XML文本“ 13.992004-07-03Z1972-09-25ZS75001-100000M00Bachelors Professional1410 + Miles      

消息6602,级别16,状态2,过程sp_xml_preparedocument,第1行[批处理开始第0行]
  错误描述是“ XML文档中仅允许一个顶级元素。”

     

信息8179,第16级,状态5,第13行
  找不到句柄为0的准备好的语句。

     

消息6607,级别16,状态3,过程sp_xml_removedocument,第1行[批处理开始第0行]
  sp_xml_removedocument:为参数1提供的值无效。

我曾尝试将所有XML包装在String str = "abc"; boolean isAlphabet = str.contains("a"); // is true boolean isNumber = str.contains("1"); // is false 标记中,因为我的印象是我的XML文件具有多个根,我知道这是不允许的。但是文件本身没有。

这是我的SQL查询

<root></root>

这是我的XML文件

DECLARE @XML AS XML, @hDoc AS INT, @SQL NVARCHAR (MAX)

SELECT @XML = BulkColumn
FROM OPENROWSET(BULK 'C:\Users\Slick\desktop\xmlTest.xml', SINGLE_BLOB) AS x;

SELECT * 
FROM AdventureWorks2016CTP3.Person.Person 
WHERE FirstName = 'John'

EXEC sp_xml_preparedocument @hDoc OUTPUT, @XML

SELECT FirstName
FROM OPENXML(@hDoc, 'Person.Person BusinessEntityID="18334" PersonType="IN" NameStyle="0" FirstName="John" MiddleName="C" LastName="Anderson" EmailPromotion="0" rowguid="B3E71FA8-890F-40A5-A36E-01D7CFCAF4F7" ModifiedDate="2014-06-02T00:00:00"')
WITH
(
    FirstName [VARCHAR](50) '@FirstName',
    BusinessEntityID [VARCHAR](100) '@BusinessEntityID'
)

EXEC sp_xml_removedocument @hDoc

Stackoverflow不允许我在正文中发布整个XML。

我应该从SMSS获取一个SQL事务代码

1 个答案:

答案 0 :(得分:1)

您应该使用nodes/value方法:

SELECT s.c.value('@FirstName', 'NVARCHAR(100)') AS FirstName,
       s.c.value('@BusinessEntityID', 'INT') AS BusinessEntityID
FROM  @xml.nodes('/Person.Person') s(c);

db<>fiddle demo


sp_xml_preparedocument/OPENXML是解析起源于SQL Server 2005的XML的一种旧方法。

提供的XML并不是格式正确的XML,它缺少根元素,但是SQL Server能够处理演示中提供的XML。