XML 在表中的列中。我想选择这个特定值:
<CreditDebitAdjustments xmlns="http://....">
<CreditDebitAdjustment>
<Header>
<CreditDebitAdjustmentHeader>
<Amount>-111.58</Amount>
这是我尝试做的:
SELECT
*,
XMLPayload.query('/CreditDebitAdjustments/CreditDebitAdjustment/Header/CreditDebitAdjustmentHeader/Amount') AS Amount
FROM Table
WHERE CustomerID = 8
如何提取值 -111.58?
最佳答案
您需要使用 value()
方法并定义你的 XML Namespaces :
WITH XMLNAMESPACES(DEFAULT 'http://.......')
SELECT XMLPayload.value('/CreditDebitAdjustments[1]/CreditDebitAdjustment[1]/Header[1]/CreditDebitAdjustmentHeader[1]/Amount[1]', 'decimal(10, 4)') AS Amount
FROM Table
WHERE CustomerID = 8;
由于 value()
方法需要一个单例,您只能从每个节点中获取第 n 次出现(在上例中是从每个节点中获取第 1 次)。如果您需要获取所有事件,则需要将其与 nodes()
结合使用:
WITH XMLNAMESPACES(DEFAULT 'http://.......')
SELECT X.value('Amount[1]', 'decimal(10, 4)') AS Amount
FROM Table AS t
CROSS APPLY XMLPayload.nodes('/CreditDebitAdjustments/CreditDebitAdjustment/Header/CreditDebitAdjustmentHeader') AS n (X)
WHERE CustomerID = 8;
简单示例:
DECLARE @T TABLE (XMLPayload XML)
INSERT @T
VALUES ('<CreditDebitAdjustments>
<CreditDebitAdjustment>
<Header>
<CreditDebitAdjustmentHeader>
<Amount>-111.58</Amount>
</CreditDebitAdjustmentHeader>
<CreditDebitAdjustmentHeader>
<Amount>5</Amount>
</CreditDebitAdjustmentHeader>
</Header>
</CreditDebitAdjustment>
</CreditDebitAdjustments>');
SELECT XMLPayload.value('/CreditDebitAdjustments[1]/CreditDebitAdjustment[1]/Header[1]/CreditDebitAdjustmentHeader[1]/Amount[1]', 'decimal(10, 4)') AS Amount
FROM @T;
SELECT X.value('Amount[1]', 'decimal(10, 4)') AS Amount
FROM @T AS t
CROSS APPLY XMLPayload.nodes('/CreditDebitAdjustments/CreditDebitAdjustment/Header/CreditDebitAdjustmentHeader') AS n (X);
关于sql - 如何将 xPath 指向 SQL Server 中 select 语句中的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28839709/