2

介绍

我正在尝试查询 SQL Server 2008 中的 xml 列,但出现无法修复的错误。

这是我使用的架构:

CREATE XML SCHEMA COLLECTION PublicationSchema AS '
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           elementFormDefault="qualified">
   <xs:import namespace="http://www.w3.org/XML/1998/namespace"
              schemaLocation="xml.xsd"/>
   <xs:element name="publication">
      <xs:complexType>
         <xs:sequence>
            <xs:element ref="metadata"/>
         </xs:sequence>
      </xs:complexType>
   </xs:element>
   <xs:element name="meta">
      <xs:complexType>
         <xs:attributeGroup ref="attlist-meta"/>
      </xs:complexType>
   </xs:element>
   <xs:attributeGroup name="attlist-meta">
      <xs:attribute name="name" use="required"/>
      <xs:attribute name="content"/>
      <xs:attribute name="scheme"/>
   </xs:attributeGroup>
   <xs:element name="metadata">
      <xs:complexType>
         <xs:sequence>
            <xs:element maxOccurs="unbounded" ref="meta"/>
         </xs:sequence>
      </xs:complexType>
   </xs:element>
   </xs:schema>'
GO

我使用架构创建带有 XML 列的表:create table test (content XML(PublicationSchema))

我插入一些数据:

insert into test values(N'<?xml version="1.0" encoding="UTF-16"?>
<publication>
    <metadata>
        <meta name="type" content="plan" scheme="city"/>
        <meta name="statistics" content="second" scheme="informationtype"/>
    </metadata>
</publication>')

问题

当我执行查询时:

select * from test
where Content.exist('/publication/metadata/meta[@name] = "type"') = 1

我收到此错误:

 Msg 2213, Level 16, State 1, Line 3
 XQuery [test.content.exist()]: Cannot atomize/apply data()
    on expression that contains type 'meta' within inferred
    type 'element(meta,#anonymous) *'

问题

有谁知道我可以做些什么来解决这个查询?

4

1 回答 1

2

您的exist函数中有语法错误。您需要在括号之间进行比较。

select * 
from test
where Content.exist('/publication/metadata/meta[@name = "type"]') = 1

如果它不适用于您的架构,这将适用于您拥有的 XML。应用该模式将给出您在评论中提到的错误,因为您没有该属性的数据类型name
您有两种选择来解决此问题。更改架构以包含数据类型或重写上面的查询,以欺骗 SQL Server 将属性视为不属于架构的一部分。

为 指定数据类型name如下所示。

<xs:attributeGroup name="attlist-meta">
   <xs:attribute name="name" use="required" type="xs:string"/>
   <xs:attribute name="content"/>
   <xs:attribute name="scheme"/>
</xs:attributeGroup>

如果您无法修改架构,则可以改用此查询。

select *
from test
where Content.query('/publication/metadata/meta').exist('/*[@name = "type"]') = 1
于 2012-06-02T13:52:34.130 回答