NT会实体化数据即对特殊字符进行转义,XML则不会。 with TestXmlExplicit
as
(
select 1 as tag,null as parent,N'衣服' as [clothes!1!category],null as [subcategory!2!name!element],null as [subcategory!2!name2!xml]
union all
select 2,1,null,N'女装',N'男装'
)
select * from TestXmlExplicit for xml explicit
结果:
<b>女装</b>
男装
上面可以看到女装部分被转义,男装部分没有。
指定CDATA with TestXmlExplicit
as
(
select 1 as tag,null as parent,N'衣服' as [clothes!1!category],null as [subcategory!2!name!cdata]
union all
select 2,1,null,N'女装'
)
select * from TestXmlExplicit for xml explicit
结果:
女装]]>
指定XMLTEXT with TestXmlExplicit
as
(
select 1 as tag,null as parent,N'衣服' as [clothes!1!category],null as [subcategory!2!NAME],null as [subcategory!2!!XMLTEXT]
union all
select 2,1,null,N'女装',N'女装补充'
)
select * from TestXmlExplicit for xml explicit
结果:
女装补充
因为对于红色字体 列没有指定 AttributeName,而指定了xmltext 指令,所以 元素中的属性被追加到包含它的 元素(即subcategory!2!NAME,不是clothes!1!category)的属性列表中。
因为 元素中的 NAME属性与相同元素级上检索到的 NAME 属性冲突,所以忽略 元素中的此属性,即使 NAME 为 NULL 也是如此。通常情况下,属性将覆盖溢出中具有相同名称的属性。但是id属性没有冲突,所以保留。 再看另一种情况: with TestXmlExplicit
as
(
select 1 as tag,null as parent,N'衣服' as [clothes!1!category],null as [subcategory!2!NAME],null as [subcategory!2!!XMLTEXT]
union all
select 2,1,null,N'女装',N'子元素'
)
select * from TestXmlExplicit for xml explicit
XMLTEXT列值包含了子元素name, 因此当前元素追加到,子元素则作为子元素追加到,结果:
子元素
再看: with TestXmlExplicit
as
(
select 1 as tag,null as parent,N'衣服' as [clothes!1!category],null as [subcategory!2!NAME],null as [subcategory!2!subname!XMLTEXT]
union all
select 2,1,null,N'女装',N'子元素'
)
select * from TestXmlExplicit for xml explicit
如果为XMLTEXT指定AttributeName(如subname),则的属性追加到,然后作为子元素追加到,结果:
子元素
总结 以上对指定EXPLICIT的XML查询就介绍完了,下一篇文章将继续用实例介绍SQL SERVER中的XML查询:指定PATH查询。
SQL SERVER中XML查询:FOR XML指定RAWSQL SERVER中XML查询:FOR XML指定AUTO
SQL SERVER中XML查询:FOR XML指定EXPLICIT
SQL SERVER中XML查询:FOR XML指定PATH关于XML类型,请参考:http://blog.csdn.net/leewhoee/article/details/8571286关于XML索引,请参考:http://blog.csdn.net/leewhoee/article/details/8579743
|