在SQLServer2005中对XML的处理功能显然增强了很多,提供了query(),value(),exist(),modify(),nodes()等函数。
关于xml,难以理解的不是SQLServer提供的函数,而是对xml本身的理解,看似很简单的文件格式,处理起来却是非常困难的。本文只是初探一下而已。
详见SQLServer联机帮助:
|
主题
说明
query()方法(xml数据类型)
此方法用于对XML实例进行查询。
value()方法(xml数据类型)
此方法用于从XML实例检索SQL类型的值。
exist()方法(xml数据类型)
此方法用于确定查询是否返回非空结果。
modify()方法(xml数据类型)
此方法用于指定XML DML语句以执行更新。
nodes()方法(xml数据类型)
此方法用于将XML拆分成多行以将XML文档的组成部分传播到行集中。
?
闲话少说,首先创建一个包含xml类型的数据表,其次创建一个xml文件,在服务端把xml文件内容加载该数据表中。
CREATE TABLE VisioXML
(
?ID?INT,
?Doc XML
);
GO
创建一个名为xxx.xml的文件,内容如下
/*
<ROOT>
?<ROW>
???<ID>1</ID>
???<NAME SEX="MALE">WBQ</NAME>
?</ROW>
?<ROW>
???<ID>2</ID>
???<NAME SEX="FEMALE">CZH</NAME>
?</ROW>
</ROOT>
*/
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字段
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!