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
» Sitemap
Free Newsletters:
DatabaseDaily  
News Via RSS Feed


follow us on Twitter
Database Journal |DBA Support |SQLCourse |SQLCourse2
 

Featured Database Articles

MS SQL

Posted Sep 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



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: Error using SQL Server credentials poverty 3 August 17th, 07:43 AM
Need help changing table contents nkawtg 1 August 17th, 03:02 AM
SQL Server Memory confifuration bhosalenarayan 2 August 14th, 05:33 AM
SQL Server Primary Key and a Unique Key katty.jonh 2 July 25th, 10:36 AM


















Thanks for your registration, follow us on our social networks to keep up-to-date