您需要使用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 次出现(上例中每个节点中的第一次出现)。如果您需要获取所有事件,则需要将其与 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);