这里是我的XML的摘录:
declare @FundXML XML
set @XML='<Transaction>
<TransactionID>58265226</TransactionID>
<SettlementCurrency>USD</SettlementCurrency>
<SettlementAmount>
<Amount ccy="EUR" isFundCcy="true">-1603375.03</Amount>
<Amount ccy="USD">-1890218.82</Amount>
</SettlementAmount>
</Transaction>'
我想检索标签金额的值,其中ccy="标签结算货币">
如果我硬编码"美元",那么它给了我正确的价值:
select trx.col.value('./SettlementCurrency[1]', 'nvarchar(20)') Settccy,
trx.col.value('(./SettlementAmount[1]/Amount[@ccy="USD"])[1]', 'nvarchar(20)') AmountInccy
from @xml.nodes('/Transaction') Trx(col)
但是我想编写类似的东西
select trx.col.value('./SettlementCurrency[1]', 'nvarchar(20)') Settccy,
trx.col.value('(./SettlementAmount[1]/Amount[@ccy=./SettlementCurrency[1]])[1]', 'nvarchar(20)') AmountInccy
from @Fundxml.nodes('/Transaction') Trx(col)
你能帮我写一个相对路径吗?我正在使用 SQL Server 2008。
谢谢
像这样试试
select trx.col.value('(SettlementCurrency/text())[1]', 'nvarchar(20)') Settccy,
trx.col.value('(SettlementAmount/Amount[@ccy=../../SettlementCurrency/text()])[1]', 'nvarchar(20)') AmountInccy
from @Fundxml.nodes('/Transaction') Trx(col)
在谓词中,您在 XML 中更深入,必须先跳出<Amount>
和<SettlementAmount>
,然后才能深入研究<SettlementCurrency>
。
如果您的 XML 中只有一个<SettlementCurrency>
,则可以改用深度搜索(带 //
(:
select trx.col.value('(SettlementCurrency/text())[1]', 'nvarchar(20)') Settccy,
trx.col.value('(SettlementAmount/Amount[@ccy=//SettlementCurrency/text()])[1]', 'nvarchar(20)') AmountInccy
from @Fundxml.nodes('/Transaction') Trx(col)
第三个选项是使用 XQuery
s let
在 </Transaction>
节点的上下文中创建具有此值的变量:
select trx.col.value('(SettlementCurrency/text())[1]', 'nvarchar(20)') Settccy,
trx.col.value('let $c:=(SettlementCurrency/text())[1]
return (SettlementAmount/Amount[@ccy=$c])[1]', 'nvarchar(20)') AmountInccy
from @Fundxml.nodes('/Transaction') Trx(col)