XML列 - 无法在推断类型中包含类型“xxx”的表达式上雾化/应用data()

时间:2012-06-02 11:45:43

标签: sql-server xquery xquery-sql

简介

我正在尝试查询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列的表:    创建表测试(内容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) *'

问题

有没有人知道我可以做些什么来解决这个问题?

1 个答案:

答案 0 :(得分: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