T-SQL之操作XML

本文介绍MSSQL2005中XML数据类型的操作方法,包括使用T-SQL进行XML查询、修改及聚合为XML格式的具体语法与实例。

 

  • 综述
      MSSQL2005引入了XML的数据类型,相应的T-SQL也提供了大量的语句和函数用于支持对XML的操作,以及维护关系型数据和XML之间的转换。
 
  • 对XML查询
      T-SQL提供了以下几个针对XML类型的查询函数:
      query(XQuery):利用Xquery查询符合条件的元素集合。
      value(XQuery,Type):利用Xquery查询具体元素的值,Type定义值的类型。
      exist(XQuery):利用Xquery查询是否存在符合条件的元素。
      nodes(XQuery):利用Xquery获得一个结果集。
 
      下面是详细的示例:
  
ContractedBlock.gifExpandedBlockStart.gif查询XML
1  DECLARE @Doc xml
2  SET @Doc = '<Books><Book ID="10001"><Name>CLR VIA C#</Name></Book><Book ID="10002"><Name>.net高级调试</Name></Book></Books>'
3  SELECT @Doc
4
5  --获取有ID属性的Book元素
6  SELECT @Doc.query('Books/Book[@ID]')
7
8  --获取第个Name元素的值
9  SELECT @Doc.value('(Books/Book/Name)[2]', 'nvarchar(128)')
10
11  --是否存在ID=10003的Book元素
12  SELECT @Doc.exist('Books/Book[@ID=10003]')
13
14  --从一个由Book元素组成的结果集中获取所有Name元素
15  SELECT T.x.query('Name') FROM @Doc.nodes('Books/Book') as T(x)
16
17  GO
  
2011041515440119.jpg
   
  • 修改XML      
XML的修改操作包括对元素及其属性和值的增加、修改、删除。T-SQL提供modify函数以实现对XML的修改操作。
  •      
SET modify('insert "" before XQuery'):在符合Xquery条件的元素之前插入元素。
  •      
SET modify('insert attribute "" into XQuery'): 在符合Xquery条件的元素中插入属性。       SET modify('replace value of XQuery with ""'):修改符合Xquery条件的元素内容。       SET modify('delete XQuery'):删除符合Xquery条件的元素内容。
  •  
  •       下面是详细的示例:
  •  
ContractedBlock.gifExpandedBlockStart.gif修改XML
1  DECLARE @Doc xml
2  SET @Doc = '<Books><Book ID="10001"><Name>CLR VIA C#</Name></Book><Book ID="10002"><Name>.net高级调试</Name></Book></Books>'
3  SELECT @Doc
4
5  --增加个Book元素
6  SET @Doc.modify('insert <Book ID="10003"><Name>WF本质论</Name></Book> before (Books/Book[@ID])[2]')
7  SELECT @Doc
8
9  --修改ID=10003的Book元素下Name元素的值
10  SET @Doc.modify('replace value of (Books/Book[@ID=10003]/Name/text())[1] with "WCF揭秘"')
11  SELECT @Doc
12
13  --删除ID=10003的Book元素
14  SET @Doc.modify('delete Books/Book[@ID=10003]')
15  SELECT @Doc
16
17  --第个ID=10001的Book元素增加个属性
18  SET @Doc.modify('insert attribute Author{"Mario Hewardt"} into (Books/Book[@ID=10001])[1]')
19  SELECT @Doc
20
21  --修改第个ID=10001的Book元素的Author属性
22  SET @Doc.modify('replace value of (Books/Book[@ID=10001]/@Author)[1] with "Jeffrey Richter"')
23  SELECT @Doc
24
25  --删除第个ID=10001的Book元素的Author属性
26  SET @Doc.modify('delete Books/Book[@ID=10001]/@Author')
27  SELECT @Doc
28
29  GO
  •  
  • 2011041515505145.jpg
  •  
  • 返回XML
      T-SQL利用FOR XML语句将SELECT语句返回的行聚合成XMLMSSQL支持以下四种模式:RAWAUTOPATH EXPLICIT,下面只讨论前三个模式。
      FOR XML AUTO [,ELEMENTS] [,ROOT('')]:表名定义成每条记录的元素名,字段名默认定义成属性,也可以设置成元素。
      FOR XML RAW('') [,ELEMENTS] [,ROOT('')]:按RAW定义每条记录的元素名,字段名默认定义成属性,也可以设置成元素。
      FOR XML PATH('') [,ROOT('')]:按PATH定义具体的XML结构。
      FOR XML语句可以配合字段别名一起定义生成的XML结构。具体可以参考下面的示例。
 
ContractedBlock.gifExpandedBlockStart.gif返回XML
1 --测试表和测试数据
2  CREATE TABLE [dbo].[Books](
3 [ID] [bigint] NOT NULL,
4 [Name] [nvarchar](128) NOT NULL
5 ) ON [PRIMARY]
6  GO
7
8  INSERT INTO [dbo].[Books]
9  VALUES
10 (10001, 'CLR VIA C#'),
11 (10002, '.net高级调试')
12 GO
13
14 --示例
15 SELECT ID,NAME FROM [dbo].[Books]
16
17 SELECT ID,NAME FROM [dbo].[Books]
18 FOR XML AUTO
19
20 SELECT ID,NAME FROM [dbo].[Books]
21 FOR XML AUTO ,ELEMENTS ,ROOT('Books')
22
23 SELECT ID as 'BookID',NAME as 'BookName' FROM [dbo].[Books]
24 FOR XML RAW
25
26 SELECT ID,NAME FROM [dbo].[Books]
27 FOR XML RAW('Book') ,ELEMENTS ,ROOT('Books')
28
29 SELECT ID,NAME FROM [dbo].[Books]
30 FOR XML PATH('')
31
32 SELECT ID as 'Detail/@ID',NAME as 'Detail/Name' FROM [dbo].[Books]
33 FOR XML PATH('Book'), ROOT('Books')
34
35 GO
 
2011041515565189.jpg
 
      需要特别声明一下,FOR XML PATH语句可以用来方便的实现列合并。
      比如要对上面的Book表合并Name字段,以“;”分隔每项:
 
1 SELECT STUFF((SELECT ';' + Name FROM [dbo].[Books] FOR XML PATH(''))
2 ,1,1,'')
 
2011041515593914.jpg
 
 
  •  

转载于:https://www.cnblogs.com/wuhong/archive/2011/04/15/2017281.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值