Search code examples
sqlsql-serverxmlsql-server-2008-r2sqlxml

add column value to an xml field as an attribute


I would like to add an attribute value to an xml field in a query. my example is below

declare @table table (bookid int,xmlCol xml)
insert into @table
select 1,
'<book title="you are not alone" author="Esther">
  <EDITIONS>
    <edition year="2012"/>
    <edition year="2013"/>
  </EDITIONS>
</book>'

declare @table1 table(bookid int,quantity int)
insert into @table1
select 1,3 

select ??? 
from @table t
inner join @table1 t1
on t.bookid = t1.bookid

I want my final result to look like this

<book title="you are not alone" author="Esther" quantity="3">
  <EDITIONS>
    <edition year="2012"/>
    <edition year="2013"/>
  </EDITIONS>
</book>

Solution

  • IF you need select data, you can use xquery:

    select
        t.xmlCol.query('
             element book {
                 for $i in book/@* return $i,
                 attribute quantity {sql:column("t1.quantity")},
                 for $i in book/* return $i
             }
        ')
    from @table t
        inner join @table1 t1 on t.bookid = t1.bookid
    

    sql fiddle demo

    or even simplier:

    select
        t.xmlCol.query('
             element book {
                 book/@*,
                 attribute quantity {sql:column("t1.quantity")},
                 book/*
             }
        ')
    from @table t
        inner join @table1 t1 on t.bookid = t1.bookid
    

    sql fiddle demo