设为首页 加入收藏

TOP

SQLSERVER中XML查询:FORXML指定EXPLICIT(一)
2014-11-23 22:21:07 来源: 作者: 【 】 浏览:32
Tags:SQLSERVER XML 查询 FORXML 指定 EXPLICIT

SQL SERVER中XML查询:FOR XML指定EXPLICIT

前言

在SQL SERVER中,XML查询可以指定RAW,AUTO,EXPLICIT,PATH。本文用一些实例介绍SQL SERVER中指定EXPLICIT的XML查询。

基础示例

一个简单的EXPLICIT例子:

with TestXmlExplicit
as
(
select 1 as tag,null as parent,'衣服' as [clothes!1!category],null as [subcategory!2!name],null as [subsubcategory!3!name]
union all
select 2,1,null,'女装',null
union all
select 3,2,null,null,'上衣'
union all  
select 3,2,null,null,'裤子'
)
select * from TestXmlExplicit

结果:

tag parent clothes!1!category subcategory!2!name subsubcategory!3!name
1 衣服
2 1 女装
3 2 上衣
3 2 裤子
注:上面空值项为null值,把它变成空白为了结果的清晰。

执行FOR XML EXPLICIT(就是上述SQL后添加FOR XML EXPLICIT):

with TestXmlExplicit
as
(
select 1 as tag,null as parent,'衣服' as [clothes!1!category],null as [subcategory!2!name],null as [subsubcategory!3!name]
union all
select 2,1,null,'女装',null
union all
select 3,2,null,null,'上衣'
union all  
select 3,2,null,null,'裤子'
)
select * from TestXmlExplicit FOR XML EXPLICIT
结果:






分析FOR XML EXPLICIT

TAG和PARENT列是必须的。PARENT为NULL或0的是根目录。列名上叹号间的数字对应TAG。

拿三级目录来说,在一级和二级目录对应列上设为NULL值即可,因为三级目灵只关心三级目录列就行了。如TAG为3的两行,clothes!1!category和subcategory!2!name没有对应值。

任意指定同级目录

TAG数字不代表目录级别!下面是新同级目录的例子:
with TestXmlExplicit
as
(
select 1 as tag,null as parent,'衣服' as [clothes!1!category],null as [subcategory!2!name],null as [subsubcategory!3!name],null as [newcategoryname!4!name]
union all
select 2,1,null,'女装',null,null
union all
select 3,2,null,null,'上衣',null
union all
select 4,2,null,null,null,'裤子'
)
select * from TestXmlExplicit for xml explicit
结果:





可以看出,三级目录中的元素名称已经更改成newcategoryname ,而”裤子“所在级别并不是四级目录。

为所有目录添加新属性

现在给每级目录添加属性ID,新SQL语句如下:

with TestXmlExplicit
as
(
select 1 as tag,null as parent,'衣服' as [clothes!1!category],1111 as [clothes!1!id],null as [subcategory!2!name],null as [subcategory!2!id],null as [subsubcategory!3!name],null as [subsubcategory!3!id]
union all
select 2,1,null,null,'女装',2222,null,0
union all
select 3,2,null,null,null,0,'上衣',3331
union all
select 3,2,null,null,null,0,'裤子',3332
)
select * from TestXmlExplicit

结果:

\
注:上面空值项为null值,把它变成空白为了结果的清晰。

运行FOR XML EXPLICIT

with TestXmlExplicit
as
(
select 1 as tag,null as parent,'衣服' as [clothes!1!category],1111 as [clothes!1!id],null as [subcategory!2!name],null as [subcategory!2!id],null as [subsubcategory!3!name],null as [subsubcategory!3!id]
union all
select 2,1,null,null,'女装',2222,null,0
union all
select 3,2,null,null,null,0,'上衣',3331
union all  
select 3,2,null,null,null,0,'裤子',3332
)
select * from TestXmlExplicit FOR XML EXPLICIT 

结果






指定ELEMENT

with TestXmlExplicit
as
(
select 1 as tag,null as parent,'衣服' as [clothes!1!category],1111 as [clothes!1!id],null as [subcategory!2!name],null as [subcategory!2!id],null as [subsubcategory!3!name!element],null as [subsubcategory!3!id!element]
union all
select 2,1,null,null,'女装',2222,null,0
union all
select 3,2,null,null,null,0,'上衣',3331
union all
select 3,2,null,null,null,0,'裤子',3332
)
select * from TestXmlExplicit for xml explicit
红色字体部分指定了element,结果:



上衣
3331


裤子
3332



需要注意的是,如果指定element的项为空值,结果集中将不显示该项,如: with TestXmlExplicit
as
(
select 1 as tag,null as parent,'衣服' as [clothes!1!category],1111 as [clothes!1!id],null as [subcategory!2!name],nul
首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇PostgreSQL位图索引 下一篇sql查询重复记录、删除重复记录方..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: