在SQLServer2005中对XML的处理功能显然增强了很多,提供了query(),value(),exist(),modify(),nodes()等函数。
关于xml,难以理解的不是SQLServer提供的函数,而是对xml本身的理解,看似很简单的文件格式,处理起来却是非常困难的。本文只是初探一下而已。
详见SQLServer联机帮助:
|
主题 |
说明 |
|
此方法用于对 XML 实例进行查询。 |
|
|
此方法用于从 XML 实例检索 SQL 类型的值。 |
|
|
此方法用于确定查询是否返回非空结果。 |
|
|
此方法用于指定 XML DML 语句以执行更新。 |
|
|
此方法用于将 XML 拆分成多行以将 XML 文档的组成部分传播到行集中。 |
闲话少说,首先创建一个包含xml类型的数据表,其次创建一个xml文件,在服务端把xml文件内容加载该数据表中。
|
CREATE TABLE VisioXML ( ID INT, Doc XML ); GO 创建一个名为xxx.xml的文件,内容如下 /*
*/ INSERT INTO VisioXML(ID,Doc) SELECT 4,* FROM OPENROWSET(BULK 'e:\xxx.xml',SINGLE_BLOB) AS x; |
--以下为value()和query()的用法
|
--SELECT * FROM VisioXML WHERE ID=4 SELECT Doc.value('(/ROOT/ROW[1]/ID/text())[1]','int') RootRowID1, --第一行ID的值,并且转换为int类型 Doc.value('(/ROOT/ROW[2]/ID/text())[1]','int') RootRowID2, --第二行ID的值,并且转换为int类型 Doc.value('(/ROOT/ROW[1]/NAME/text())[1]','varchar(20)') RootRowNAME1, --第一行NAME的值,并且转换为VARCHAR类型 Doc.value('(/ROOT/ROW[1]/NAME/@SEX)[1]','varchar(20)') RootRowNAME1SEX, --第一行NAME中SEX属性的值,并且转换为VARCHAR类型 Doc.query('/ROOT') Root, --ROOT下的所有XML内容,类型为XML Doc.query('/ROOT/ROW[1]') RootRow1, --ROOT下第一行所有的XML内容,类型为XML Doc.query('/ROOT/ROW[2]') RootRow2 --ROOT下第二行所有的XML内容,类型为XML FROM VisioXML WHERE ID=4 |
--以下为exist()函数在两种环境下的用法
|
SELECT Doc.exist('/ROOT/ROW[1]/NAME[(@SEX cast as xs:string?) = xs:string("MALE")]') Row1EQStringMale, Doc.exist('/ROOT/ROW[1]/NAME[(@SEX cast as xs:string?) = "MALE"]') Row1EQMale, Doc.exist('/ROOT/ROW[1]/ID[(text()[1] cast as xs:float?) = xs:float(1)]') Row1EQfloat1, Doc.exist('/ROOT/ROW[2]/ID[(text()[1] cast as xs:float?) = 2]') Row1EQ1 FROM VisioXML WHERE ID=4
SELECT ID,Doc FROM VisioXML WHERE ID=4 AND Doc.exist('/ROOT/ROW[1]/NAME[(@SEX)]')=1 --第一行NAME中存在SEX属性 --AND Doc.exist('/ROOT/ROW[1]/NAME[not(@SEX)]')=1 --第一行NAME中不存在SEX属性 --AND Doc.exist('/ROOT/ROW[1][not(ID/*)]')=1 --第一行不存在ID字段 --AND Doc.exist('/ROOT/ROW[1][(ID/*)]')=1 --第一行存在ID字段 |
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/6517/viewspace-628451/ ,如需转载,请注明出处,否则将追究法律责任。