我有这个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')
但没有成功。
答案 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'