sqlserver FOR XML查询参数EXPLICIT的实例
SQL SERVER中XML查询:FOR XML指定EXPLICIT
基础示例
一个简单的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 | 裤子 |
执行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
结果:
<clothes category="衣服">
<subcategory name="女装">
<subsubcategory name="上衣" />
<subsubcategory name="裤子" />
</subcategory>
</clothes>
分析FOR XML EXPLICIT
TAG和PARENT列是必须的。PARENT为NULL或0的是根目录。列名上叹号间的数字对应TAG。
拿三级目录来说,在一级和二级目录对应列上设为NULL值即可,因为三级目灵只关心三级目录列就行了。如TAG为3的两行,clothes!1!category和subcategory!2!name没有对应值。
任意指定同级目录
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
结果:
<subcategory name="女装">
<subsubcategory name="上衣" />
<newcategoryname name="裤子" />
</subcategory>
</clothes>
为所有目录添加新属性
现在给每级目录添加属性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
结果
<clothes category="衣服" id="1111">
<subcategory name="女装" id="2222">
<subsubcategory name="上衣" id="3331" />
<subsubcategory name="裤子" id="3332" />
</subcategory>
</clothes>
指定ELEMENT
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,结果:
<subcategory name="女装" id="2222">
<subsubcategory>
<name>上衣</name>
<id>3331</id>
</subsubcategory>
<subsubcategory>
<name>裤子</name>
<id>3332</id>
</subsubcategory>
</subcategory>
</clothes>
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,'裤子',null
)
select * from TestXmlExplicit for xml explicit
<subcategory name="女装" id="2222">
<subsubcategory>
<name>上衣</name>
<id>3331</id>
</subsubcategory>
<subsubcategory>
<name>裤子</name>
</subsubcategory>
</subcategory>
</clothes>
指定ELEMENTXSINIL
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 !ELEMENTXSINIL]
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,'裤子', null
)
select * from TestXmlExplicit for xml explicit
注意红色字体部分,最后一列指定了 ELEMENTXSINIL,为了测试,把最后一行最后一列的值改为NULL。
<subcategory name="女装" id="2222">
<subsubcategory>
<name>上衣</name>
<id>3331</id>
</subsubcategory>
<subsubcategory>
<name>裤子</name>
<id xsi:nil="true" />
</subsubcategory>
</subcategory>
</clothes>
指定 ID 和 IDREF
as
(
select 1 as tag,null as parent,N'LeeWhoeeUniversity' as [clothes!1!category],'011' as [clothes!1!cloid !id],'099' as [clothes!1!cloidref !idref]
)
select * from TestXmlExplicit
tag | parent | clothes!1!category | clothes!1!cloid!id | clothes!1!cloidref!idref |
---|---|---|---|---|
1 | LeeWhoeeUniversity | 011 | 099 |
执行 for xml explicit,xmldata:
as
(
select 1 as tag,null as parent,N'LeeWhoeeUniversity' as [clothes!1!category],'011' as [clothes!1!cloid!id],'099' as [clothes!1!cloidref!idref]
)
select * from TestXmlExplicit for xml explicit,xmldata
<ElementType name="clothes" content="mixed" model="open">
<AttributeType name="category" dt:type="string" />
<AttributeType name="cloid" dt:type="id" />
<AttributeType name="cloidref" dt:type="idref" />
<attribute type="category" />
<attribute type="cloid" />
<attribute type="cloidref" />
</ElementType>
</Schema>
<clothes xmlns="x-schema:#Schema6" category="LeeWhoeeUniversity" cloid="011" cloidref="099" />
指定 IDREFS 指令
as
(
select 1 as tag,0 as parent,null as [clothes!1!cloidlist!idrefs]
union all
select 1,0,'022'
union all
select 1,0,'025'
)
select * from TestXmlExplicit
tag | parent | clothes!1!cloidlist!idrefs |
---|---|---|
1 | 0 | |
1 | 0 | 022 |
1 | 0 | 025 |
-
with TestXmlExplicit
-
as
-
(
-
select 1 as tag,0 as parent,null as [clothes!1!cloidlist!idrefs]
-
union all
-
select 1,0,'022'
-
union all
-
select 1,0,'025'
-
-
-
)
-
select * from TestXmlExplicit for xml explicit,xmldata
<ElementType name="clothes" content="mixed" model="open">
<AttributeType name="cloidlist" dt:type="idrefs" />
<attribute type="cloidlist" />
</ElementType>
</Schema>
<clothes xmlns="x-schema:#Schema4" cloidlist="022 025"></clothes>
指定 HIDE
as
(
select 1 as tag,null as parent,N'衣服' as [clothes!1!category],null as [subcategory!2!name],null as [subsubcategory!3!name !hide]
union all
select 2,1,null,N'女装',null
union all
select 3,2,null,null,N'上衣'
union all
select 3,2,null,null,N'裤子'
)
select * from TestXmlExplicit
tag | parent | clothes!1!category | subcategory!2!name | subsubcategory!3!name!hide |
---|---|---|---|---|
1 | 衣服 | |||
2 | 1 | 女装 | ||
3 | 2 | 上衣 | ||
3 | 2 | 裤子 |
as
(
select 1 as tag,null as parent,N'衣服' as [clothes!1!category],null as [subcategory!2!name],null as [subsubcategory!3!name!hide]
union all
select 2,1,null,N'女装',null
union all
select 3,2,null,null,N'上衣'
union all
select 3,2,null,null,N'裤子'
)
select * from TestXmlExplicit for xml explicit
<subcategory name="女装">
<subsubcategory />
<subsubcategory />
</subcategory>
</clothes>
指定ELEMENT和XML的不同
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'<b>女装</b>',N'<b>男装</b>'
)
select * from TestXmlExplicit for xml explicit
<subcategory>
<name><b>女装</b></name>
<name2>
<b>男装</b>
</name2>
</subcategory>
</clothes>
指定CDATA
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'<b>女装</b>'
)
select * from TestXmlExplicit for xml explicit
<subcategory>
<name><![CDATA[<b>女装</b>]]></name>
</subcategory>
</clothes>
指定XMLTEXT
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' <s NAME="test" id="12">女装补充 </s>'
)
select * from TestXmlExplicit for xml explicit
<subcategory NAME="女装" id="12">女装补充</subcategory>
</clothes>
-
因为对于红色字体 列没有指定 AttributeName,而指定了xmltext 指令,所以 <s>元素中的属性被追加到包含它的 <subcategory> 元素(即subcategory!2!NAME,不是clothes!1!category)的属性列表中。
-
因为 <xmltext> 元素中的 NAME属性与相同元素级上检索到的 NAME 属性冲突,所以忽略 <xmltext> 元素中的此属性,即使 NAME 为 NULL 也是如此。通常情况下,属性将覆盖溢出中具有相同名称的属性。但是id属性没有冲突,所以保留。
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'<s NAME="test" id="12"><name>子元素</name></s>'
)
select * from TestXmlExplicit for xml explicit
<subcategory NAME="女装" id="12">
<name>子元素</name>
</subcategory>
</clothes>
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'<s NAME="test" id="12"><name>子元素</name></s>'
)
select * from TestXmlExplicit for xml explicit
<subcategory NAME="女装">
<subname NAME="test" id="12">
<name>子元素</name>
</subname>
</subcategory>
</clothes>