Sql server XQuery父级和子级

Sql server XQuery父级和子级,sql-server,xml,tsql,xquery,sqlxml,Sql Server,Xml,Tsql,Xquery,Sqlxml,例如: DECLARE @XML XML = ' <Items> <document id="doc1" value="100"> <details> <detail detailID="1" detailValue="20"/> <detail detailID="2" detailValue="80"/> </details>

例如:

DECLARE @XML XML = '
<Items>
    <document id="doc1" value="100">
        <details>
            <detail detailID="1" detailValue="20"/>
            <detail detailID="2" detailValue="80"/>
        </details>
    </document>
    <document id="doc2" value="0">
        <details>
        </details>
    </document>
</Items>
'
尝试:

SELECT document.value('../../@docID', 'VARCHAR(10)') AS 'docID',
       document.value('../../@value', 'INT') AS 'value',
       document.value('@detailID', 'VARCHAR(10)') AS 'detailID',
       document.value('@detailValue', 'INT') AS 'detailValue'
FROM   @XML.nodes('Items/document/details/detail') AS Documents(document)
但是,doc2没有列出。。。另外,尝试了交叉连接和内部连接,但性能非常差。

尝试以下方法:

SELECT document.value('@id', 'VARCHAR(10)') AS docID,
       document.value('@value', 'INT') AS value,
       Detail.value('@detailID', 'INT') as DetailId,
       Detail.value('@detailValue', 'INT') as DetailValue
FROM   @XML.nodes('Items/document') AS Documents(document)
       outer apply Documents.document.nodes('details/detail') as Details(Detail);
试试这个:

SELECT document.value('@id', 'VARCHAR(10)') AS docID,
       document.value('@value', 'INT') AS value,
       Detail.value('@detailID', 'INT') as DetailId,
       Detail.value('@detailValue', 'INT') as DetailValue
FROM   @XML.nodes('Items/document') AS Documents(document)
       outer apply Documents.document.nodes('details/detail') as Details(Detail);

只需添加一个细节:

@XML.nodes('//whatever_depth') AS Documents(document)
使用“//”允许您不直接从根目录进行查询

问候,,
丹尼斯

只增加了一个细节:

@XML.nodes('//whatever_depth') AS Documents(document)
使用“//”允许您不直接从根目录进行查询

问候,,
丹尼斯

不客气。但表现糟糕吗?您必须在一些非常大的XML文档或大量记录上执行此操作。祝你好运不是真的3文档应用程序。。。问题很深。。。用你的方法,我得做三件事。。。3个文档=6秒钟内响应…不客气。但表现糟糕吗?您必须在一些非常大的XML文档或大量记录上执行此操作。祝你好运不是真的3文档应用程序。。。问题很深。。。用你的方法,我得做三件事。。。3个文档=6秒内响应。。。