Search code examples
sqlxmldatabasexml-column

Select 2nd row in XML Column in database using SQL


Having trouble selecting a specific info from an XML Format in a column of a table in the database. I need to pull the Success message for 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

Below is the data inside the XML column within the database - what I want to achieve is to show the 2nd ResultType "success" in the query with SQL.

<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>

Currently I'm trying to use the SQL below to no avail

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

Hopefully this makes sense, I found it quite difficult to explain, I am very new to SQL


Solution

  • Check it out below.

    Assuming your db is MS SQL Server.

    The XQuery .value() method has two mandatory parameters.

    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;
    

    Output

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