从XPath到SQL Server XML列的总和中消除xml节点

时间:2018-08-26 07:05:34

标签: sql-server xml xpath

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

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

如何通过一个节点的名称来例外一个节点?

说这是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')

但没有成功。

2 个答案:

答案 0 :(得分:2)

虽然Marc的答案是我最想做的,但是下面有一个小技巧给你

mount_uploader :photo, PhotoUploader

答案 1 :(得分:0)

您可以在CTE中将XML解析为名称和值,然后从该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'