http://www.sqlservercentral.com/blogs/steve_jones/2010/03/23/inserting-into-an-xml-document/

Printed 2014/10/01 02:54PM

Inserting into an XML document

By Steve Jones, 2010/03/23

I was reading through the latest XML Workshop article that I have from Jacob Sebastian. It’s a fantastic series for learning little bits of XML as you go and I’ve tried to read through most of them and learn something. I’m not a big XML guy, but I am trying to work on learning one thing each day.

The article goes through this, but adding an element to an XML document is easy with the insert element syntax. I experimented a bit with Jacob’s syntax in a few ways. I decided I’d use the current list of books I’m reading as my data. Here’s my first thing:

DECLARE @x xml          
SET @x = '<Books></Books>'          

DECLARE @name VARCHAR(50)
SELECT @name = 'The Federalist Papers'

SET @x.modify('
    insert element Employee {sql:variable("@name")}
    into (Books)[1]
    ')

SELECT @x

That returned (spacing mine)

<Books>

<Employee>

  The Federalist Papers

</Employee>

</Books>

As you can see, I cut and pasted Jacob’s code before playing with it, so I have the inner element name wrong. I fixed that, and then added a second insert.

DECLARE @x xml          
SET @x = '
<Books>
</Books>'          

DECLARE @name VARCHAR(50)
SELECT @name = 'The Federalist Papers'

SET @x.modify('
    insert element Book {sql:variable("@name")}
    into (Books)[1]
    ')

SELECT @name = 'Treasure Hunt'

SET @x.modify('
    insert element Book {sql:variable("@name")}
    into (Books)[1]
    ')

SELECT @x

Which returned this (my spacing):

<Books>

  <Book>The Federalist Papers</Book>

  <Book>Treasure Hunt</Book>

</Books>

I left out the first keyword, but I’ll add it in here.

DECLARE @x xml          
SET @x = '
<Books>
</Books>'          

DECLARE @name VARCHAR(50)
SELECT @name = 'The Federalist Papers'

SET @x.modify('
    insert element Book {sql:variable("@name")}
    into (Books)[1]
    ')

SELECT @name = 'Treasure Hunt'
SET @x.modify('
    insert element Book {sql:variable("@name")}
    into (Books)[1]
    ')

SELECT @name = 'Total Recall'
SET @x.modify('
    insert element Book {sql:variable("@name")}
    as first
    into (Books)[1]
    ')

SELECT @x

That gives me the first book as Total Recall, which is a great book.

<Books>

  <Book>Total Recall</Book>

  <Book>The Federalist Papers</Book>

  <Book>Treasure Hunt</Book>

</Books>

I checked books inline for the insert command and found that there are first and last keywords you can use for elements, but not attributes.

I decided to get fancy with an attribute then. I wanted to add the author attribute for the book Total Recall. So I tried a little hard coding. I knew this was the first element in my document (below the root), so checking the example in Books Online, I tried this:

SELECT @name = 'Jim Gemmell'
SET @x.modify('
    insert attribute author {sql:variable("@name")}
     into (/Books/Book[1])[1]
    ')

It worked! I got this result.

<Books>

  <Book author="Jim Gemmell">

    Total Recall

  </Book>

  <Book>The Federalist Papers</Book>

  <Book>Treasure Hunt</Book>

</Books>

Nothing amazing here, but since I don’t work with XML data much at this level, it was kind of cool to use Jacob’s article and actually accomplish something.


Copyright © 2002-2014 Simple Talk Publishing. All Rights Reserved. Privacy Policy. Terms of Use. Report Abuse.