Sql 用于解释架构定义的XQuery语法
环境:SQL Server 2012 假设我有一个带有xml列WordIndex的表消息。我还有一个表字,它有WordId和WordText。Message.WordIndex的Xml具有以下架构:Sql 用于解释架构定义的XQuery语法,sql,xml,xquery-sql,Sql,Xml,Xquery Sql,环境:SQL Server 2012 假设我有一个带有xml列WordIndex的表消息。我还有一个表字,它有WordId和WordText。Message.WordIndex的Xml具有以下架构: <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"
<xs:schema attributeFormDefault="unqualified"
elementFormDefault="qualified"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.com">
<xs:element name="wi">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" name="w">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" name="p" type="xs:unsignedByte" />
</xs:sequence>
<xs:attribute name="wid" type="xs:unsignedByte" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
这个(这个不起作用,因为我开始在其中引入模式):
问题:
对.value()和.nodes()调用的参数进行限定的正确语法是什么?
我遇到了我不完全理解的错误:
XQuery [Message.WordIndex.value()]: 'value()' requires a singleton (or empty sequence), found operand of type 'xdt:anyAtomicType *'
尝试以下查询:
;with xmlnamespaces( default 'http://www.example.com'), WordIds as
(
select distinct
t.c.value('@wid', 'int') as XmlWordId
from
Message as m
cross apply
m.WordIndex.nodes('/wi/w') as t(c)
inner join Word as w
on w.WordId = t.c.value('@wid', 'int')
-- some more joins go here ...
)
select
count(*)
from
WordIds
;with xmlnamespaces( default 'http://www.example.com')
select
w.c.value('@wid', 'INT') wid,
p.c.value('.', 'INT') p
from message m
cross apply m.wordIndex.nodes('wi/w') w(c)
cross apply w.c.nodes('p') p(c)
通常,尝试避免父轴(..),因为它有性能问题。而是使用多个交叉应用从左到右深入到xml
有关名称空间的详细信息,请参阅本文:
使用与XMLNAMESPACES一起添加名称空间
尝试以下查询:
;with xmlnamespaces( default 'http://www.example.com'), WordIds as
(
select distinct
t.c.value('@wid', 'int') as XmlWordId
from
Message as m
cross apply
m.WordIndex.nodes('/wi/w') as t(c)
inner join Word as w
on w.WordId = t.c.value('@wid', 'int')
-- some more joins go here ...
)
select
count(*)
from
WordIds
;with xmlnamespaces( default 'http://www.example.com')
select
w.c.value('@wid', 'INT') wid,
p.c.value('.', 'INT') p
from message m
cross apply m.wordIndex.nodes('wi/w') w(c)
cross apply w.c.nodes('p') p(c)
通常,尝试避免父轴(..),因为它有性能问题。而是使用多个交叉应用从左到右深入到xml
有关名称空间的详细信息,请参阅本文:
使用与XMLNAMESPACES一起添加名称空间
这只是语法规则之一,引用自:
“当CTE用于作为批处理一部分的语句时,它前面的语句必须后跟分号。”这只是语法规则之一,引用自:
“当CTE用于作为批处理一部分的语句时,它前面的语句必须后跟分号。”非常感谢!为什么在“with”之前有一个分号?这只是使用with时的规则之一,无论是名称空间还是公共表表达式(CTE)。除了能够将查询附加到另一个查询之外,它还有什么意义?没有“;”的话效果很好。后续问题:非常感谢!为什么在“with”之前有一个分号?这只是使用with时的规则之一,无论是名称空间还是公共表表达式(CTE)。除了能够将查询附加到另一个查询之外,它还有什么意义?它可以正常工作,没有“;”后续问题:
XQuery [Message.WordIndex.value()]: 'value()' requires a singleton (or empty sequence), found operand of type 'xdt:anyAtomicType *'
;with xmlnamespaces( default 'http://www.example.com'), WordIds as
(
select distinct
t.c.value('@wid', 'int') as XmlWordId
from
Message as m
cross apply
m.WordIndex.nodes('/wi/w') as t(c)
inner join Word as w
on w.WordId = t.c.value('@wid', 'int')
-- some more joins go here ...
)
select
count(*)
from
WordIds
;with xmlnamespaces( default 'http://www.example.com')
select
w.c.value('@wid', 'INT') wid,
p.c.value('.', 'INT') p
from message m
cross apply m.wordIndex.nodes('wi/w') w(c)
cross apply w.c.nodes('p') p(c)