Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 用于解释架构定义的XQuery语法_Sql_Xml_Xquery Sql - Fatal编程技术网

Sql 用于解释架构定义的XQuery语法

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"

环境:SQL Server 2012

假设我有一个带有xml列WordIndex的表消息。我还有一个表字,它有WordId和WordText。Message.WordIndex的Xml具有以下架构:

<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)