sql-server - 在 XPath 到 SQL Server XML 列中从 sum 中消除 xml 节点

标签 sql-server xml xpath

我有这个 XPath 表达式,它总结了最深 XML 层次结构中的所有节点,而不使用节点名称:

select  @data.value('sum(//*[not(*)])', 'float')

如何通过其名称对一个节点进行异常(exception)处理?

说这是xml:
<c>
  <b1>
    <a>1</a>
    <d>4</d>
    <g>5</g>
 </b1>
 <b1>
   <a>7</a>
   <d>1</d>
   <g>2</g>
 </b1>
</c>

我希望总和包含“d”和“g”,没有“a”,但“a”将作为参数传递,因此需要在表达式中表示为参数。我尝试了以下方法:
declare @except varchar(max) = 'a'


select  @data.value('sum(//*[not(*)])', 'float') - @data.value('sum(//*:local-name()=sql:variable("@except"))', 'float')

但没有成功。

最佳答案

您可以将 XML 解析为 CTE 中的名称和值,然后从该 CTE 中进行选择 - 如下所示:

DECLARE @Data XML = '...(your XML here).....';

;WITH XmlCte AS
(
    SELECT
        NodeName = xc.value('local-name(.)', 'varchar(25)'),
        NodeValue = xc.value('(.)[1]', 'int')
    FROM 
        @Data.nodes('/c/b1/*') AS XT(XC)
)
SELECT SUM(x.NodeValue)
FROM XmlCte x
WHERE x.NodeName <> 'a'

关于sql-server - 在 XPath 到 SQL Server XML 列中从 sum 中消除 xml 节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52023948/

相关文章:

java - DOM 中两个不同元素的 Xpath OR 条件

sql-server - 合并语句错误调试

SQL字符串添加问题

java - 即使使用 values-night 也无法在我的应用程序中禁用夜间模式

php - PHP Dom XPath-为什么不起作用?

xml - 一次返回两个 XML 节点

java - 无法通过 *.hbm.xml 文件中声明的 nameQuery 执行 SP

sql-server - SQL Server 2005 数据加密和 LINQ TO SQL

c# - 将新的 XElement 添加到现有的 XElement(如果它不存在)

html - 使用 xml 和可重用的 xslt 动态生成 HTML 表单