Search code examples
sqlsql-serverxmlxquerysqlxml

How can I query a SQL Server XML column and return all values for a specific node?


I have the following XML in a XML column in SQL Server.

  <qualifiers>
    <qualifier>
      <key>111</key>
      <message>a match was not found</message>
    </qualifier>
    <qualifier>
      <key>222</key>
      <message>a match was found</message>
    </qualifier>
    <qualifier>
      <key>333</key>
      <message>error</message>
    </qualifier>
  </qualifiers>

How can I write TSQL to return all the values in qualifiers/qualifier/message in a comma delimited string? My goal is to have the query return the values from the XML in a single column for each row.

The results should look like this:

"a match was not found, a match was found, error"

Solution

  • SQLFiddle for the same: Solution as per @xQbert suggested

    create table Temp (col1 xml)
    go
    
    insert into Temp (col1)
    values('<qualifiers>
        <qualifier>
          <key>111</key>
          <message>a match was not found</message>
        </qualifier>
        <qualifier>
          <key>222</key>
          <message>a match was found</message>
        </qualifier>
        <qualifier>
          <key>333</key>
          <message>error</message>
        </qualifier>
      </qualifiers>')
    go
    
    SELECT
        STUFF((SELECT 
                  ',' + fd.v.value('(.)[1]', 'varchar(50)')
               FROM 
                  Temp
               CROSS APPLY
                  col1.nodes('/qualifiers/qualifier/message') AS fd(v)
               FOR XML PATH('')
              ), 1, 1, '')