Select 数据库中 XML 列中的第 2 行使用 SQL

Select 2nd row in XML Column in database using SQL

无法从数据库中 table 的列中的 XML 格式中选择特定信息。我需要提取 ModuleID 959

的成功消息
SubmissionID ModuleID CreatedOn XMLCOL UpdatedOn
25 959 1-1-22 "see XML below" 1-1-22
26 339 2-1-22 Null 2-1-22

下面是数据库中 XML 列中的数据 - 我想要实现的是在 SQL.

查询中显示第二个 ResultType“成功”
<ArrayOfActionResult xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <ActionResult>
    <ResultType>Redirected to Payment</ResultType>
    <ActionName>Payment</ActionName>
    <ExecutionTime></ExecutionTime>
    <ConditionSet>
      <Conditions />
      <ExecuteCondition>Always</ExecuteCondition>
      <MatchCondition>All</MatchCondition>
      <ExecuteStatus>0</ExecuteStatus>
      <Groups />
    </ConditionSet>
    <ConditionsMet>true</ConditionsMet>
    <Condition />
  </ActionResult>
  <ActionResult>
    <ResultType>Success</ResultType>
     <ActionName>Payment</ActionName>
    <ExecutionTime></ExecutionTime>
    <ConditionSet>
      <Conditions />
      <ExecuteCondition>Always</ExecuteCondition>
      <MatchCondition>All</MatchCondition>
      <ExecuteStatus>0</ExecuteStatus>
      <Groups />
    </ConditionSet>
    <ConditionsMet>true</ConditionsMet>
  </ActionResult>
</ArrayOfActionResult>

目前我正在尝试使用下面的 SQL 但没有用

SELECT [XMLCOL].value('/ArrayOfActionResult/ActionResult/ResultType[2]') as PaymentMessage
FROM Databasetable
where [ModuleID] = 959

希望这是有道理的,我发现很难解释,我是 SQL

的新手

在下面查看。

假设您的数据库是 MS SQL 服务器。

XQuery .value() 方法有两个强制参数。

SQL

-- DDL and sample data population, start
DECLARE @tbl TABLE (ModuleID INT PRIMARY KEY, XMLCOL XML);
INSERT INTO @tbl (ModuleID, XMLCOL) VALUES
(959, N'<ArrayOfActionResult xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <ActionResult>
        <ResultType>Redirected to Payment</ResultType>
        <ActionName>Payment</ActionName>
        <ExecutionTime></ExecutionTime>
        <ConditionSet>
            <Conditions/>
            <ExecuteCondition>Always</ExecuteCondition>
            <MatchCondition>All</MatchCondition>
            <ExecuteStatus>0</ExecuteStatus>
            <Groups/>
        </ConditionSet>
        <ConditionsMet>true</ConditionsMet>
        <Condition/>
    </ActionResult>
    <ActionResult>
        <ResultType>Success</ResultType>
        <ActionName>Payment</ActionName>
        <ExecutionTime></ExecutionTime>
        <ConditionSet>
            <Conditions/>
            <ExecuteCondition>Always</ExecuteCondition>
            <MatchCondition>All</MatchCondition>
            <ExecuteStatus>0</ExecuteStatus>
            <Groups/>
        </ConditionSet>
        <ConditionsMet>true</ConditionsMet>
    </ActionResult>
</ArrayOfActionResult>');
-- DDL and sample data population, end

SELECT ModuleID
    , XMLCOL.value('(/ArrayOfActionResult/ActionResult[2]/ResultType/text())[1]','VARCHAR(30)') as PaymentMessage
FROM @tbl
WHERE ModuleID = 959;

输出

+----------+----------------+
| ModuleID | PaymentMessage |
+----------+----------------+
|      959 | Success        |
+----------+----------------+