简介
我正在尝试查询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) *'
问题
有没有人知道我可以做些什么来解决这个问题?
答案 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