XML解析:获取指定属性节点值及匹配币种的Amount节点值
动态匹配XML中对应的节点值
我来帮你搞定这个动态匹配的需求——完全不用硬编码币种,咱们可以直接通过XML节点关系或者SQL变量来实现自动匹配。
核心思路
先获取<SettlementCurrency>标签的文本值,再用这个值作为筛选条件,找到@ccy属性与之匹配的<Amount>节点内容。
方法一:直接在XQuery中关联节点
这是最简洁的写法,直接在XPath里引用<SettlementCurrency>的值:
declare @FundXML XML set @FundXML='<Transaction> <TransactionID>58265226</TransactionID> <SettlementCurrency>USD</SettlementCurrency> <SettlementAmount> <Amount ccy="EUR" isFundCcy="true">-1603375.03</Amount> <Amount ccy="USD">-1890218.82</Amount> </SettlementAmount> </Transaction>' -- 动态匹配的查询语句 SELECT @FundXML.value('(/Transaction/SettlementAmount/Amount[@ccy = /Transaction/SettlementCurrency/text()])[1]', 'DECIMAL(18,2)') AS MatchingAmount
代码解释:
/Transaction/SettlementCurrency/text():提取结算币种的文本值(这里是USD)@ccy = /Transaction/SettlementCurrency/text():用提取到的币种值筛选对应的<Amount>节点[1]:确保只返回第一个匹配的节点(如果存在多个同币种的<Amount>,可根据实际需求调整)DECIMAL(18,2):指定返回的金额数据类型,适配金额场景
方法二:用SQL变量存储币种值(更灵活)
如果需要后续复用这个币种值,或者想让逻辑更清晰,可以先把币种提取到变量中,再在XQuery里引用:
declare @FundXML XML set @FundXML='<Transaction> <TransactionID>58265226</TransactionID> <SettlementCurrency>USD</SettlementCurrency> <SettlementAmount> <Amount ccy="EUR" isFundCcy="true">-1603375.03</Amount> <Amount ccy="USD">-1890218.82</Amount> </SettlementAmount> </Transaction>' -- 先提取币种到变量 DECLARE @SettlementCurrency VARCHAR(3) = @FundXML.value('(/Transaction/SettlementCurrency/text())[1]', 'VARCHAR(3)') -- 用变量筛选对应的Amount节点 SELECT @FundXML.value('(/Transaction/SettlementAmount/Amount[@ccy = sql:variable("@SettlementCurrency")])[1]', 'DECIMAL(18,2)') AS MatchingAmount
代码解释:
sql:variable("@SettlementCurrency"):在XQuery中引用SQL变量,实现动态匹配- 这种方式更适合复杂场景,比如需要多次使用币种值进行其他计算的情况
内容的提问来源于stack exchange,提问作者Anne
相关产品推荐
相关产品推荐

