sql - 如何将 xPath 指向 SQL Server 中 select 语句中的值?

标签 sql sql-server xpath xquery

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/

相关文章:

MySQL-在两个 group_by 之后尝试两列的 sum()

MySQL 连接表并拉取信息进行检查

sql - DBD::CSV 和占位符

sql - 需要使用 SQL 减去两列

r - 如何在 R 中使用 xpath 导航 XML

mysql - 拿两个表,一对多,我怎样才能过滤掉很多表,然后加入 1 表中的所有匹配项?

c# - NullReferenceException错误数据库数据到表html

sql-server - 有没有办法在后台运行 MS Access 查询?

SQL Server - 仅使用 .modify() 合并两个 XML

php - 检查 domnodelist->item(x)->nodeValue == "nbsp;"