--使用 RAW 和 AUTO 模式不能很好地控制从查询结果生成的 XML 的形状。
--但是,对于要从查询结果生成 XML,EXPLICIT 模式会提供非常好的灵活性。

--必须以特定的方式编写 EXPLICIT 模式查询,以便将有关所需的 XML 的附加信息(如 XML 中的所需嵌套)显式指定为查询的一部分。
--根据所请求的 XML,编写 EXPLICIT 模式查询可能会很烦琐。您会发现使用 PATH 模式(具有嵌套)相对编写 EXPLICIT 模式查询而言更加简单。
--因为将所需的 XML 描述为 EXPLICIT 模式查询的一部分,所以必须确保生成的 XML 格式正确且有效。

--> 测试数据:#tb
IF OBJECT_ID('TEMPDB.DBO.#tb') IS NOT NULL
DROP TABLE #tb
GO
CREATE TABLE #tb
(
[id] INT IDENTITY PRIMARY KEY ,
[name] VARCHAR(4),
[type] VARCHAR(10)
)
INSERT #tb
SELECT '彪' , '流氓'
UNION ALL
SELECT '阿紫' , '流氓'
UNION ALL
SELECT '小强' , '流氓'
UNION ALL
SELECT '光辉' , '臭流氓'
UNION ALL
SELECT '小D' , '臭流氓'
UNION ALL
SELECT '野子' , '臭流氓'
--------------开始查询--------------------------
--EXPLICIT 模式会将由查询执行生成的行集转换为 XML 文档。
--为使 EXPLICIT 模式生成 XML 文档,行集必须具有特定的格式。
--这需要您编写 SELECT 查询以生成具有特定格式的行集(通用表),以便处理逻辑随后可以生成所需的 XML。

--首先,查询必须生成下列两个元数据列:
--第一列必须提供当前元素的标记号(整数类型),并且列名必须是 Tag。查询必须为从行集构造的每个元素提供唯一标记号。
--第二列必须提供父元素的标记号,并且此列的列名必须是 Parent。这样,Tag 和 Parent 列将提供层次结构信息。

SELECT
1 AS Tag,--Tag 是一个强制列,代表一个最高节点
NULL AS Parent,--Parent 同样是一个强之列,代码中NULL表示没有父节点,也就是该层次为顶层。
3 AS [node!1]
--"node!1" 此种形式代表的是根节点。
--"node" 元素名称
--"1" 代表的是指定层次结构的节点级别
FOR XML EXPLICIT

SELECT
1 AS Tag,
NULL AS Parent,
NULL AS [root!1],
NULL AS [node!2!id!ELEMENT]
UNION ALL
SELECT
2 AS Tag,--这里的tag 代表的是第二层的意思
1 AS Parent,--Parent的值代表了是Tag的父节点
NULL ,
id
FROM #tb WHERE id=1
FOR XML EXPLICIT
--------------结果--------------------------
/*
<root>
<node>
<id>1</id>
</node>
</root>
*/
--------------注释--------------------------
/*
[node!2!id!ELEMENT]
node 代表的是节点名称;
2代表的节点层次;
id 表示的是元素名称;.
ELEMENT 选项表示向 <node> 元素添加了 <id> 元素子级,而不是添加属性。
*/
--再添加一个节点
SELECT
1 AS Tag,
NULL AS Parent,
NULL AS [root!1],
NULL AS [node!2!id],
NULL AS [root2!3!value]
UNION ALL
SELECT
2 AS Tag,--这里的tag 代表的是第二层的意思
1 AS Parent,--Parent的值代表了是Tag的父节点
NULL,
id,NULL
FROM #tb WHERE id=1
UNION ALL
SELECT
3 AS Tag,
2 AS Parent,
NULL ,
0,
-1
FOR XML EXPLICIT
--------------结果--------------------------
/*
<root>
<node>
<id>1</id>
<root2>
<value>-1</value>
</root2>
</node>
</root>
*/

SELECT
1 AS Tag,
NULL AS Parent,
NULL AS [root!1],
NULL AS [node!2!id!ELEMENT],
NULL AS [root2!3!value!ELEMENT]
UNION ALL
SELECT
2 AS Tag,--这里的tag 代表的是第二层的意思
1 AS Parent,--Parent的值代表了是Tag的父节点
NULL,
id,NULL
FROM #tb WHERE id=1
UNION ALL
SELECT
3 AS Tag,
2 AS Parent,
NULL ,
0,
-1
FOR XML EXPLICIT

转载---SQL Server XML基础学习<3>之--FOR XML EXPLICIT的更多相关文章

  1. 转载---SQL Server XML基础学习<2>之--FOR XML AUTO/RAW

    本文主要介绍FOR XML 的 AUTO 模式和 RAW 模式 --AUTO 模式将查询结果以嵌套 XML 元素的方式返回.这不能较好地控制从查询结果生成的 XML 的形式. --如果要生成简单的层次 ...

  2. 转载---SQL Server XML基础学习<1>之--FOR XML PATH

    --> 测试数据:#tbIF OBJECT_ID('TEMPDB.DBO.#tb') IS NOT NULL    DROP TABLE #tbGO CREATE TABLE #tb      ...

  3. sql server 数据库基础学习心得 思维导图

  4. XML基础学习02<linq to xml>

    Linq to XML的理解 1:这是一种比较好的操作Xml的工具. àXDocument 文档 àXElement 元素 àXAttribute 属性 àXText 文本 2:这里还是和我们之前创建 ...

  5. C#面试题(转载) SQL Server 数据库基础笔记分享(下) SQL Server 数据库基础笔记分享(上) Asp.Net MVC4中的全局过滤器 C#语法——泛型的多种应用

    C#面试题(转载) 原文地址:100道C#面试题(.net开发人员必备)  https://blog.csdn.net/u013519551/article/details/51220841 1. . ...

  6. mysql与sql server参照对比学习mysql

    mysql与sql server参照对比学习mysql 关键词:mysql语法.mysql基础 转自桦仔系列:http://www.cnblogs.com/lyhabc/p/3691555.html ...

  7. cmd常用命令 和 sql server相关基础

    在Java开发中 ms sql server 接触算是比较少的,本文记录一些ms sql server的基础知识. 1. 为表字段增加索引:create index user_openid on us ...

  8. Sql Server数据库基础

    --------------------------------------第一章  Sql Server数据库基础------------------------------------------ ...

  9. 第一篇——第一文 SQL Server 备份基础

    原文:第一篇--第一文 SQL Server 备份基础 当看这篇文章之前,请先给你的所有重要的库做一次完整数据库备份.下面正式开始备份还原的旅程. 原文出处: http://blog.csdn.net ...

随机推荐

  1. [BILL WEI]stimulsoft reports DEMO自动生成模板

    stimulsoft reports是一款强大的报表开发工具,能够开发各式各样的报表. 对于初学者而言,任何报表开发,刚开始都是去模仿,熟练掌握之后,自己才能独立开发,而在报表开发实际过程中, 我们所 ...

  2. Spring mvc get和post传值乱码问题

    1.url拼值 传单值 对象 list  map都是用json的格式传入后台 <%@ page language="java" contentType="text/ ...

  3. Zend Studio 或者Eclipse下安装插件Spket(以Zend为例)

    1. Help>Install New Software... 2. 在Work With:后输入网址 http://www.agpad.com/update,点击Add 3. 输入Name:S ...

  4. HDOJ-ACM1023(JAVA)

    题意:输入栈的大小,输出可能的出栈顺序的个数. 这道题,如果做了1022,那就只要在上面改改就行了, 第一想法是加上全排列-----结果是正确的,但是绝对会超时 验证性的实现了:(Time Limit ...

  5. HDOJ-ACM1016(JAVA) 字典序全排列,并剪枝

    转载声明:原文转自http://www.cnblogs.com/xiezie/p/5576273.html 题意: 一个环是用图中所示的n个圆组成的.把自然数1.2.…….n分别放入每个圆中,并在相邻 ...

  6. ZOJ2834--Maximize Game Time(树形DP)

    写之前觉得很恶心,写完了觉得挺好玩了,1A,棒棒哒~ 题解全在代码注释中了,想清楚思路一路写下了果然没怎么卡 ^_^ /**************************************** ...

  7. Java和.NET的GZIP压缩功能对比

    本文主要比较了Java和.NET提供的GZIP压缩功能. 介绍 在本文中,我们将讨论Java和.NET提供的GZIP压缩功能,并且用实例来说明哪个压缩方法更佳. 在Java中,我们有提供GZIP压缩的 ...

  8. 模拟等待事件row lock waits

    是索引块分裂引起的锁等待,往往与enq: TX - index contention 伴随产生,enq:TX - index contention的解释. Waits for TX in mode 4 ...

  9. [GIF] GIF Loop Coder - Animation Functions

    Previous, we animate the item by passing an array to tell the start position and end position. To ma ...

  10. php连接oracle

    1.安装oracle客户端,不管是32位还是64位:当系统是32位的时候,要装32位的客户端,PL/SQL才能给连上数据库 2.php.ini中对应的oracle相关扩展打开.php_openssl. ...