JOJ
踏踏实实做人,认认真真做事!放纵自己就是毁灭自己!

以下为学习记录,参照SQL Server 2008 联机丛书资料及其他书籍,以前知道sql中可以处理XML数据,但是没有了解得很肤浅,由于现在很多web站点提供API,但是返回的数据大都是XML格式的,解析也主要是用C#解析的! 但是我想如果把xml放在数据用sql来解析,在生成表是不是更好呢?(说实话,实际项目中还没有用XML字段呢!)先学习记录!

 

USE Northwind
GO
/**
    新建表, EmployeedetailsXML字段使用XML类型
*/
CREATE TABLE XMLEmployeeTable
    (
      EmployeeId INT ,
      EmployeedetailsXML XML
    )
GO
/**
    插入测试数据
*/
INSERT  INTO XMLEmployeeTable
VALUES  ( 1, '<ROOT><Employee Name="Harvey" Age="22" Sex="Male" /></ROOT>' )
INSERT  INTO XMLEmployeeTable
VALUES  ( 2,
          CAST('<ROOT><Employee Name="Jinho" Age="20" Sex="Female" /></ROOT>' AS XML) )
GO        
SELECT  *
FROM    XMLEmployeeTable
1 
/**
    使用XQuery 查询
*/

SELECT EmployeeId ,
        EmployeedetailsXML.query('/ROOT/Employee') FROM dbo.XMLEmployeeTable
GO
/**
    判断Employee 节点是否存在Age 属性
*/
SELECT  EmployeedetailsXML.exist('/ROOT/Employee[@Age]') AS '是否存在该属性' FROM dbo.XMLEmployeeTable

/**
    请注意,各种路径表达式都指定“[1]”以要求每次只返回单个目标。这样就确保了只有单个目标节点
    为XML节点添加属性插入重复的属性则报错[可用上面语句判断一下]
*/
UPDATE  XMLEmployeeTable
SET     EmployeedetailsXML.modify('insert attribute City{"ChengDu"} as first into (/ROOT/Employee)[1]')
GO         
2 
/**
    添加子节点节点[可以插入重复的节点] 
*/
UPDATE  XMLEmployeeTable
SET     EmployeedetailsXML.modify('insert <Province>SiChuang</Province> as last into (/ROOT/Employee)[1]')
3 
/**
     插入文本节点
*/
UPDATE  XMLEmployeeTable
SET     EmployeedetailsXML.modify('insert text{"Hello world"} as last into (/ROOT/Employee/Province)[1]')
4 
/**
    使用XQuery查询
*/
SELECT  EmployeedetailsXML.query('/ROOT/Employee')
FROM    XMLEmployeeTable ;

-- 替换[把XMLEmployeeTable表中EmployeedetailsXML字段中Employee节点中Age的值修改为]
UPDATE  XMLEmployeeTable
SET     EmployeedetailsXML.modify('replace value of (/ROOT/Employee/@Age)[1] with "20" ')
5
--把Province的文本值修改为sichuang
UPDATE XMLEmployeeTable SET EmployeedetailsXML.modify('replace value of (/ROOT/Employee/Province[1]/text())[1] with "sichuang" ') 6
--使用IF判断后,修改节点属性值
UPDATE XMLEmployeeTable SET EmployeedetailsXML.modify(' replace value of (/ROOT/Employee/@Age)[1] with ( if ((/ROOT/Employee/@Age) = 20) then "22" else "20" ) ') 7 /** [删除节点中的属性] */ UPDATE XMLEmployeeTable SET EmployeedetailsXML.modify('delete(/ROOT/Employee/@City)[1]') 8
/** 删除文本节点 */
UPDATE XMLEmployeeTable SET EmployeedetailsXML.modify('delete(/ROOT/Employee/Province/text())[1]') 9
/** 删除节点元素Province */
UPDATE XMLEmployeeTable SET EmployeedetailsXML.modify('delete(/ROOT/Employee/Province)') 10 以下了解指向 “SQL Server 2008 联机丛书”

插入 (XML DML)

 delete (XML DML)

query() 方法(xml 数据类型)

替换 (XML DML) 的值

官方示例1


 

官方示例2

 

 

 


 

官方示例3

官方示例4

 

Technorati 标签: sql,xml
posted on 2010-08-21 19:11  JoinJ  阅读(744)  评论(0编辑  收藏  举报