7

This is my sample XML:

<root>
    <element>
        <subelement>
            <value code="code1">value1</value>
            <value code="code2">value2</value>
        </subelement>
    </element>
</root>

And this is my test query:

DECLARE @tempTable TABLE (
    ValueCode nvarchar(MAX),
    Value nvarchar(MAX)
)

DECLARE @xml XML
select @xml = cast(c1 as xml) from OPENROWSET (BULK 'C:\test.xml', SINGLE_BLOB) as T1(c1)

INSERT INTO @tempTable
SELECT 
    Tbl.Col.value('subelement[1]/@code', 'NVARCHAR(MAX)'),
    Tbl.Col.value('subelement[1]', 'NVARCHAR(MAX)')
FROM @xml.nodes('//element') Tbl(Col)

SELECT * FROM @tempTable

The query, when executed, gives out a row with the ValueCode column containing NULL and the Value column containing 'value1value2'. What I would like to get would be the attributes and values concatenated with a separator. For example, I need ValueCode to contain 'code1; code2' and Value to contain 'value 1; value2'. How can I achieve that?

Roman Pekar
  • 107,110
  • 28
  • 195
  • 197
sdds
  • 2,021
  • 2
  • 25
  • 33

1 Answers1

8

you can use xuery if you want concatenated strings:

SELECT 
    Tbl.Col.query('for $i in value return concat($i/text()[1], ";")').value('.', 'nvarchar(max)'),
    Tbl.Col.query('for $i in value return concat($i/@code, ";")').value('.', 'nvarchar(max)')
FROM @xml.nodes('root/element/subelement') Tbl(Col);

if you want your values into rows:

SELECT 
    Tbl.Col.value('.', 'nvarchar(max)'),
    Tbl.Col.value('@code', 'nvarchar(max)')
FROM @xml.nodes('root/element/subelement/value') Tbl(Col);

sql fiddle demo

Roman Pekar
  • 107,110
  • 28
  • 195
  • 197
  • This answer was a helpful introduction to the XQuery feature to return concatenated values from stored XML. It took a little work to find out more information about this XQuery FLWOR syntax to complete my task of returning concatenated values, filtered by another attribute. Here are some useful links: [FLWOR Syntax](https://learn.microsoft.com/en-us/sql/xquery/flwor-statement-and-iteration-xquery?view=sql-server-ver15) and [Basic XQuery examples](https://www.mssqltips.com/sqlservertip/2889/basic-sql-server-xml-querying/). – Rich Moss Sep 16 '21 at 19:08