SQL Server 2005/2008增加了对XML数据的支持,同时也新增了几种操作XML的方法,本文主要以SQL Server 2008为例介绍如何对XML数据进行insert、update、delete。
  
      SQL Server中新增加了XML.Modify()方法,分别为xml.modify(insert),xml.modify(delete),xml.modify(replace)对应XML的插入,删除和修改操作。 
本文以下面XML为例,对三种DML进行说明: 
declare 
@XMLVar xml = ' 
 
 
Windows Step By Step 
Bill Zack 
49.99 
 
 
Developing ADO .NET 
Andrew Brust 
39.93 
 
 
Windows Cluster Server 
Stephen Forte 
59.99 
 
 ' 
1.XML.Modify(Insert)语句介绍 
A.利用as first,at last,before,after四个参数将元素插入指定的位置 
set 
@XMLVar.modify 
( 
'insert 
 as first into (/catalog[1]/book[1])' 
) 
set 
@XMLVar.modify 
( 
'insert 
 as last into (/catalog[1]/book[1])' 
) 
set 
@XMLVar.modify 
( 
'insert 
 before (/catalog[1]/book[1]/author[1])' 
) 
set 
@XMLVar.modify 
( 
'insert  after (/catalog[1]/book[1]/author[1])' 
) 
SELECT 
@XMLVar.query('/catalog[1]/book[1]' 
); 
结果集为: 
> 
/> 
Windows Step By Step 
/> 
Bill Zack 
/> 
49.99 
/> 
 B.将多个元素插入文档中 
--方法一:利用变量进行插入 
DECLARE @newFeatures xml; 
SET @newFeatures = N' 
one element second element' 
SET @XMLVar.modify(' 
) 
insert sql:variable("@newFeatures") 
into (/catalog[1]/book[1])' 
--方法二:直接插入 
set @XMLVar.modify(' 
) 
insert (
one element,
second element) 
into (/catalog[1]/book[1]/author[1])' 
SELECT @XMLVar.query('/catalog[1]/book[1]' 
); 
结果集为: 
1: 
< 
book 
category 
="ITPro" 
> 
2: 
< 
title 
> 
Windows Step By Step 
title 
> 
3: 
< 
author 
> 
Bill Zack 
4: 
< 
first 
> 
one element 
first 
> 
5: 
< 
second 
> 
second element 
second 
> 
6:  
author 
> 
7: 
< 
price 
> 
49.99 
price 
> 
8: 
< 
first 
> 
one element 
first 
> 
9: 
< 
second 
> 
second element 
second 
> 
10:  
book 
> 
C.将属性插入文档中 
--使用变量插入 
declare @var nvarchar(10) = '变量插入' 
set @XMLVar.modify( 
'insert (attribute var {sql:variable("@var")}) 
) 
into (/catalog[1]/book[1])' 
--直接插入 
set @XMLVar.modify( 
'insert (attribute name {"直接插入"}) 
) 
into (/catalog[1]/book[1]/title[1])' 
--多值插入 
set @XMLVar.modify( 
'insert (attribute Id {"多值插入1"},attribute name {"多值插入2"}) 
) 
into (/catalog[1]/book[1]/author[1])' 
SELECT @XMLVar.query('/catalog[1]/book[1]' 
); 
结果集为: 
1: 
var="变量插入" 
> 
2: 
>Windows Step By Step 
3: 
name="多值插入2" 
>Bill Zack 
4: 
49.99 
5: 
 D.插入文本节点 
set 
@XMLVar.modify 
( 
'insert text{"at first"} as first 
) 
into (/catalog[1]/book[1])' 
SELECT 
@XMLVar.query('/catalog[1]/book[1]' 
); 
结果集为: 
1: 
< 
book 
category 
="ITPro" 
> 
2: 
at first 
3: 
< 
title 
> 
Windows Step By Step 
title 
> 
4: 
< 
author 
> 
Bill Zack 
author 
> 
5: 
< 
price 
> 
49.99 
price 
> 
6:  
book 
> 
注意:插入本文同样具体 as first,as last,before,after四种选项,可以参考A中的使用方法 
E.插入注释节点 
set @XMLVar.modify( 
'insert  
) 
before (/catalog[1]/book[1]/title[1])' 
SELECT @XMLVar.query('/catalog[1]/book[1]' 
); 
结果集为: 
1: 
> 
2: 
 
3: 
Windows Step By Step 
4: 
Bill Zack 
5: 
49.99 
6: 
 注意插入注释节点同样具体 as first,as last,before,after四种选项,可以参考A中的使用方法 
F.插入处理指令 
set @XMLVar.modify( 
'insert  
) 
before (/catalog[1]/book[1]/title[1])' 
SELECT @XMLVar.query('/catalog[1]/book[1]' 
); 
结果集为: 
1: 
 
2:  
3: Windows Step By Step 
4: Bill Zack 
5: 49.99 
6:  
注意插入处理指令同样具体 as first,as last,before,after四种选项,可以参考A中的使用方法 
G.根据 if 条件语句进行插入 
set @XMLVar.modify( 
'insert 
) 
if (/catalog[1]/book[1]/title[2]) then 
text{"this is a 1 step"} 
else ( text{"this is a 2 step"} ) 
into (/catalog[1]/book[1]/price[1])' 
SELECT @XMLVar.query('/catalog[1]/book[1]' 
); 
结果集为: 
1:  
2: Windows Step By Step 
3: Bill Zack 
4: 49.99this isa 2 step 
5:  
2.XML.Modify(delete)语句介绍 
--删除属性 
set @XMLVar.modify('delete /catalog[1]/book[1]/@category') 
--删除节点 
set @XMLVar.modify('delete /catalog[1]/book[1]/title[1]') 
--删除内容 
set @XMLVar.modify('delete /catalog[1]/book[1]/author[1]/text()') 
--全部删除 
set @XMLVar.modify('delete /catalog[1]/book[2]') 
SELECT @XMLVar.query('/catalog[1]'); 
结果集为: 
1:  
2:  
3:  
4: 49.99 
5:  
6:  
7: Windows Cluster Server 
8: Stephen Forte 
9: 59.99 
10:  
11:  
3.XML.Modify(replace)语句介绍 
--替换属性 
set @XMLVar.modify('replace value of(/catalog[1]/book[1]/@category)) 
with ("替换属性")' 
--替换内容 
set @XMLVar.modify('replace value of(/catalog[1]/book[1]/author[1]/text()[1])) 
with("替换内容")' 
--条件替换 
set @XMLVar.modify('replace value of (/catalog[1]/book[2]/@category)) 
with( 
if(count(/catalog[1]/book)>4) then 
"条件替换1" 
else 
"条件替换2")' 
SELECT @XMLVar.query('/catalog[1]' 
); 
结果集为: 
1:  
2:  
3: Windows Step By Step 
4: 替换内容 
5: 49.99 
6:  
7:  
8:  
Developing ADO .NET 
9: 
 
Andrew Brust 
10: 39.93 
11:  
12:  
13: Windows Cluster Server 
14: Stephen Forte 
15: 59.99 
16:  
17: