Free Newsletters:
DatabaseDaily  
Database Journal
Search Database Journal:
 
MS SQL Oracle DB2 Access MySQL PostgreSQL Sybase PHP SQL Etc SQL Scripts & Samples Links Database Forum

» Database Journal Home
» Database Articles
» Database Tutorials
MS SQL
Oracle
DB2
MS Access
MySQL
» RESOURCES
Database Tools
SQL Scripts & Samples
Links
» Database Forum
» DBA Jobs
» Sitemap

News Via RSS Feed


follow us on Twitter





Brocade Doubles Down on 16 Gbps Fibre Channel

Microsoft Wants iOS Apps to Run on WP7

Avaya Debuts New Virtual Services Switch
Database Journal |DBA Support |SQLCourse |SQLCourse2







Technical Specialist – Pre-sales (MA)
Next Step Systems
US-MA-Littleton

Justtechjobs.com Post A Job | Post A Resume

Featured Database Articles

MS SQL

September 6, 2006

SQL Server 2005 - DML Usage on an untyped XML column

By Muthusamy Anantha Kumar aka The MAK

DML or Data Manipulation Language is a set of statements used to store, retrieve, modify, and erase data from a database. DML does the following actions:

Insert – Adding new data
Delete – Removing existing data
Update – Modify existing data with new data

In SQL Server 2005, Microsoft introduced a new data type called XML to handle XML documents. It also provided a set of statements to store, retrieve, modify and erase data from the XML data type.

In this article, I am going to illustrate how to use data manipulation language (DML) for untyped XML columns.

Step 1

Let us assume that we have a database named "test" and we have a table, MyXMLtable, in the database. Let us also assume that we have the following XML data stored in a table as shown below.

Execute the following statements.

USE [master]
GO
/****** Object:  Database [test]    Script Date: 08/24/2006 14:50:29 ******/
IF  EXISTS (SELECT name FROM sys.databases WHERE name = N'test')
DROP DATABASE [test]
go
Create database test
go
USE [test]
GO
/****** Object:  Table [dbo].[MyXMLTable]    Script Date: 08/24/2006 14:50:14 ******/
IF  EXISTS (SELECT * FROM sys.objects 
  WHERE object_id = OBJECT_ID(N'[dbo].[MyXMLTable]') AND type in (N'U'))
DROP TABLE [dbo].[MyXMLTable]
go
create table MyXMLTable (id int, xmldat XML)
go
insert into MyXMLTable select 1,'
<?Names of Cat?> 
<Root>
 <!-- How to name your cat -->
<Cats> 
 <AmericanShorthair color="Grey" Friendly="No">Tiger</AmericanShorthair>
 <PersianHimalayan>MeowMeow</PersianHimalayan>
 <JapaneseBobtail>Rainbow River</JapaneseBobtail>
</Cats>
</Root>
'
go
insert into MyXMLTable select 2,'
<?Names of Dog?> 
<Root>
 <!-- How to name your Dog -->
<Dog> 
 <GreyHound color="dottedwhite" Intelligence="None">oldie</GreyHound>
 <Pomeranian>Jackie</Pomeranian>
 <ShihTzu>Rainbow</ShihTzu>
</Dog>
</Root>
'
go

Step 2

Let us query all the names of the dogs with an id of 2, using the following query:

Use test
go
SELECT xmldat.query(' //Dog') FROM MyXMLTable  where id=2

You will get the results shown below.

<Dog><GreyHound color="dottedwhite" Intelligence="None">oldie</GreyHound>
   <Pomeranian>Jackie</Pomeranian><ShihTzu>Rainbow</ShihTzu></Dog>

Let us query all the names of the PersianHimalayan cats with an id of 1, using the following query.

Use test
go
SELECT xmldat.query(' //Cats/PersianHimalayan') FROM MyXMLTable  where id=1

You will get the results as shown below

<PersianHimalayan>MeowMeow</PersianHimalayan>

Step 3

Let us delete the PersianHimalayan from the XML data for the ID 1. In order to delete a part of data from a table row, we are going to use the UPDATE statement and when updating the column we are going to use a special statement, columnname.modify, with XML DML commands.

Use test
go
UPDATE MyXMLTable 
SET xmldat.modify('delete /Root/Cats/PersianHimalayan ') where id =1

Now let us query the PersianHimalayan cats using the following query.

Use test
go
SELECT xmldat.query(' //Cats/PersianHimalayan') FROM MyXMLTable  where id=1

It returns nothing.

Now let us query all of the cats using the following query.

Use test
go
SELECT xmldat.query(' //Cats') FROM MyXMLTable  where id=1

You will get the result shown below.

<Cats><AmericanShorthair color="Grey" Friendly="No">Tiger</AmericanShorthair><JapaneseBobtail>Rainbow River</JapaneseBobtail></Cats>

Step 4

Let us insert a new dog breed, Dalmatian, with the name "Mayliah," using the following statement.

Use test
go
UPDATE MyXMLTable 
SET xmldat.modify('insert <Dalmation>Mayliah</Dalmation> 
as first  
into   
(/Root/Dog)[1]') where id =2

Let us query all of the Dogs using the following query.

Use test
go
SELECT xmldat.query('//Dog') FROM MyXMLTable  where id=2

You will get the result shown below:

<Dog><Dalmation>Mayliah</Dalmation><GreyHound color="dottedwhite" Intelligence="None">oldie</GreyHound>
   <Pomeranian>Jackie</Pomeranian><ShihTzu>Rainbow</ShihTzu></Dog>

Note: The data is inserted as the first row in the XML data.

Let us insert a new cat breed, oriental, with the name Serena. However, this time we are going to insert this row between Americanshorthair and japanesebobtail.

Execute the following statement.

Use test
go
UPDATE MyXMLTable 
SET xmldat.modify('insert <Oriental>Serena</Oriental> 
before (/Root/Cats/JapaneseBobtail)[1] ') where id =1

Let us query all of the Cats using the following query.

Use test
go
SELECT xmldat.query(' //Cats') FROM MyXMLTable  where id=1

You will get the result shown below:

<Cats><AmericanShorthair color="Grey" Friendly="No">Tiger</AmericanShorthair>
   <Oriental>Serena</Oriental><JapaneseBobtail>Rainbow River</JapaneseBobtail></Cats>

Note: The data is inserted in between Americanshorthair and japanesebobtail.

Step 5

So far, we have seen how to insert and delete the data from the XML. Using the combination of delete and insert, we can update the data. This is the same in DML triggers. Microsoft also provided a replace value statement used for updating discrete values. The only discrete values possible in an XML document are the contents of a tag or the value of an attribute.

Let us update the attribute value of AmericanShortHair from Friendly="No" to Friendly="Yes."

Execute the following statement.

Use test
go
UPDATE MyXMLTable 
SET xmldat.modify('
  replace value of (/Root/Cats/AmericanShorthair[@color="Grey"]/@Friendly)[1]
  with "Yes" ') where id =1

Let us query all of the Cats using the following query:

Use test
go
SELECT xmldat.query(' //Cats') FROM MyXMLTable  where id=1

You will get the result shown below:

<Cats><AmericanShorthair color="Grey" Friendly="Yes">Tiger</AmericanShorthair><Oriental>Serena</Oriental><JapaneseBobtail>Rainbow River</JapaneseBobtail></Cats>

Let us update the attribute value of GreyHound from Intelligence="None"

To Intelligence ="Some."

Execute the following statement:

Use test
go
UPDATE MyXMLTable 
SET xmldat.modify('
  replace value of (/Root/Dog/GreyHound[@color="dottedwhite"]/@Intelligence)[1]
  with "Some" ') where id =2

Let us query all of the Cats using the following query:

Use test
go
SELECT xmldat.query(' //Dog') FROM MyXMLTable  where id=2

You will get the result shown below.

<Dog><Dalmation>Mayliah</Dalmation><GreyHound color="dottedwhite" Intelligence="Some">oldie</GreyHound>
   <Pomeranian>Jackie</Pomeranian><ShihTzu>Rainbow</ShihTzu></Dog>

Conclusion

This article has illustrated how to use data manipulation language (DML) for an untyped XML column.

» See All Articles by Columnist MAK

Tools:
Add databasejournal.com to your favorites
Add databasejournal.com to your browser search box
IE 7 | Firefox 2.0 | Firefox 1.5.x
Receive news via our XML/RSS feed

MS SQL Archives

Comment and Contribute

 


(Maximum characters: 1200). You have characters left.

 

 



Latest Forum Threads
MS SQL Forum
Topic By Replies Updated
SQL 2005: SSIS: Script Component: Working with BLOB 0010 4 January 27th, 03:03 PM
Will an MS SQL db table trigger affect the value returned by scope_identity? wreade 2 December 19th, 04:48 PM
BULK UPDATE error benedec 1 December 14th, 08:39 AM
Toggling problem in Matrix report ssrs 2008 dev_ritesh 0 December 2nd, 02:17 PM