sql-server - SQL Server .nodes() XML 父节点名称

标签 sql-server xml sql-server-2008-r2

    declare @xmlsample xml =
'<root>
    <solution>
        <solutionnumber>1</solutionnumber>
            <productgroup>
                <productcategory>
                    <price>100</price>
                    <title>Some product</title>
                    <tax>1</tax>
                </productcategory>
            </productgroup>
            <productcategory2>
                    <price>200</price>
                    <title>Some other product</title>
                    <tax>2</tax>
            </productcategory2>
    </solution>
    <solution>
        <solutionnumber>2</solutionnumber>
            <productcategory2>
                    <price>200</price>
                    <title>Some other product</title>
                    <tax>2</tax>
            </productcategory2>
    </solution>
</root>'

SELECT 
    --T.C.value('(./ancestor::ns1:solutionNumber)[1]', 'varchar(50)') AS solutionnumber ?? no clue
    T.C.value('(price)[1]', 'numeric(18,2)') AS price
    ,T.C.value('(title)[1]', 'varchar(50)') AS title
    ,T.C.value('(tax)[1]', 'numeric(18,2)') AS tax
FROM @xmlsample.nodes('//node()[title]') AS T(C)

我试图在 SQL Server 2008 r2 中分解的 XML 的表示。我找到“标题”节点并获取产品类别中我需要的值。现在我想获得“解决方案编号”,但这可能是产品上方的一个或多个父节点,因为存在某些产品“组”。

我将如何通过名称(“solutionnumber”)检查父节点直到找到它?感谢您的帮助。

最佳答案

没有直接的方法可以获取我的知识。但是,您可以使用 COALESCE 向上搜索:

SELECT
    COALESCE(T.C.value('../solutionnumber[1]', 'INT'),
             T.C.value('../../solutionnumber[1]', 'INT'),
             T.C.value('../../../solutionnumber[1]', 'INT')) solutionnumber,
    T.C.value('(price)[1]', 'numeric(18,2)') AS price,
    T.C.value('(title)[1]', 'varchar(50)') AS title,
    T.C.value('(tax)[1]', 'numeric(18,2)') AS tax
  FROM
    @xmlsample.nodes('//node()[title]') AS T ( C )

请注意 <solutionnumber > 实际上是祖先之一的 sibling ,而不是祖先本身。

此解决方案要求您提前知道最大深度。


如果你宁愿前进而不是后退,你也可以使用这个解决方案:

SELECT solutionNodes.solutionNode.value('solutionnumber[1]','INT') AS solutionnumber,
    T.C.value('(price)[1]', 'numeric(18,2)') AS price,
    T.C.value('(title)[1]', 'varchar(50)') AS title,
    T.C.value('(tax)[1]', 'numeric(18,2)') AS tax
FROM @xmlsample.nodes('//solution') AS solutionNodes (solutionNode)
CROSS APPLY (SELECT solutionNodes.solutionNode.query('.')) solutions(solutionXML)
CROSS APPLY solutions.solutionXML.nodes('//node()[title]') T ( C )

它使用了 <solutionnumber 的事实> 标签是 <solution 的直接子代> 标签。首先全部<solution > 找到标签。比它的所有标题后代都具有交叉应用。因为您不能在节点上使用节点函数,所以中间有“query('.')”的计算。

除了上面的解决方案,这个解决方案可以处理 <solution 之间的任何距离。 > 标记 abd <title > 标签。

关于sql-server - SQL Server .nodes() XML 父节点名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13096203/

相关文章:

sql-server - 如何让sequelize在其SQL语句中的Unicode字符串前加N?

sql-server - 直接或通过中介将第三个表与第一个表连接

SSIS 在 com 应用程序进程任务参数中添加多个命令行

sql-server - SQL Server DMV - sys.dm_db_missing_index_group_stats - 这些列的含义是什么?

sql-server - 如何使用 SSIS 将 Powershell 输出加载到 SQL 表中?

java - 解析 SVG - java.net.MalformedURLException : no protocol: <? xml 版本 ="1.0"编码 ="UTF-8"独立 ="no"?>

xml - 用于打印 XML 标记值的 Grep 命令

xml - Perl XML::LibXML::Schema 将在出现第一个错误时停止验证

sql-server-2008-r2 - 查找上次时间表已更新

node.js - pool.request 不是一个函数