【问题标题】:XML Schema Collection breaks xqueryXML Schema Collection 破坏了 xquery
【发布时间】:2015-02-17 02:24:18
【问题描述】:

下面的脚本可用于显示我遇到的问题的示例。该脚本将返回错误“没有名为'this'的元素”。

如果我将@XML 变量的声明更改为无类型XML(将DECLARE @XML XML(Test) 行替换为DECLARE @XML XML),我不会收到错误消息,而是会得到预期的结果。

为什么在使用 Schema 集合时会出现错误,如何避免它 - 我想用正确类型的 xml 填充表列,但我无法从列中取回数据。

IF EXISTS (SELECT name FROM sys.xml_schema_collections WHERE name = 'test') DROP XML SCHEMA COLLECTION Test
CREATE XML SCHEMA COLLECTION Test AS
'<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
      xmlns:t="http://tempuri.org/this.xsd"
      targetNamespace="http://tempuri.org/this.xsd"
      elementFormDefault="qualified">
  <xsd:element name ="this">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="What" minOccurs="1" maxOccurs="1" >
          <xsd:simpleType>
            <xsd:restriction base ="xsd:string">
              <xsd:enumeration value ="01."/>
              <xsd:enumeration value ="02."/>
              <xsd:enumeration value ="03."/>
              <xsd:enumeration value ="04."/>
            </xsd:restriction>
          </xsd:simpleType>
        </xsd:element>
        <xsd:element name="When" minOccurs="1" maxOccurs="1" >
          <xsd:simpleType>
            <xsd:restriction base ="xsd:string">
              <xsd:enumeration value ="01."/>
              <xsd:enumeration value ="02."/>
            </xsd:restriction>
          </xsd:simpleType>
        </xsd:element>
        <xsd:element name="Outcome" minOccurs="1" maxOccurs="1" >
          <xsd:simpleType>
            <xsd:restriction base ="xsd:string">
              <xsd:enumeration value ="one"/>
              <xsd:enumeration value ="two"/>
              <xsd:enumeration value ="whatever"/>
              <xsd:enumeration value =""/>
            </xsd:restriction>
          </xsd:simpleType>
        </xsd:element>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>'
GO

    DECLARE @XML XML(Test)

    SET @XML = 
    '<this xmlns="http://tempuri.org/this.xsd">
      <What>02.</What>
      <When>01.</When>
      <Outcome></Outcome>
    </this>'

    SELECT @XML

    SELECT
        Field.value('What[1]','VARCHAR(100)')
    FROM @Xml.nodes('/this') AS this(Field)

【问题讨论】:

    标签: sql xml sql-server-2008 xsd xquery


    【解决方案1】:

    问题在于您的命名空间声明:&lt;this xmlns="http://tempuri.org/this.xsd"&gt;。该 XML sn-p 中的所有内容都属于名称空间http://tempuri.org/this.xsd。您的查询使用了 thisWhat 的非限定名称。改用这个:

    ;WITH XMLNAMESPACES (
        'http://tempuri.org/this.xsd' as t
    )
    SELECT
        Field.value('t:What[1]','VARCHAR(100)')
    FROM @Xml.nodes('/t:this') AS this(Field)
    

    【讨论】:

    • 很棒的@ZoffDino,效果很好。当您说问题出在命名空间声明时,这是否意味着解决方案是一种解决方法?我应该更改 xml 以使声明不再是问题,还是正确,但在查询键入的 xml 时我总是需要使用WITH XMLNAMESPACES 行?
    • 如果你想保留命名空间,你总是必须使用WITH XMLNAMESPACES。如果你删除它,你就不必了。根据您的业务需求选择一种。我不推荐其中一个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    • 2019-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多