SQL Server XML基础学习<3>之--FOR XML EXPLICIT
--使用 RAW 和 AUTO 模式不能很好地控制从查询结果生成的 XML 的形状。--但是,对于要从查询结果生成 XML,EXPLICIT 模式会提供非常好的灵活性。--必须以特定的方式编写 EXPLICIT 模式查询,以便将有关所需的 XML 的附加信息(如 XML 中的所需嵌套)显式指定为查询的一部分。--根据所请求的 XML,编写 EXPLICIT 模式查询可能会很烦琐。您会发现使用 PATH 模式(具有嵌套)相对编写 EXPLICIT 模式查询而言更加简单。--因为将所需的 XML 描述为 EXPLICIT 模式查询的一部分,所以必须确保生成的 XML 格式正确且有效。--> 测试数据:#tbIF OBJECT_ID('TEMPDB.DBO.#tb') IS NOT NULL DROP TABLE #tbGO 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 EXPLICITSELECT 1 AS Tag,NULL AS Parent,NULL AS [root!1],NULL AS [node!2!id!ELEMENT]UNION ALLSELECT 2 AS Tag,--这里的tag 代表的是第二层的意思1 AS Parent,--Parent的值代表了是Tag的父节点NULL ,idFROM #tb WHERE id=1FOR 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 ALLSELECT 2 AS Tag,--这里的tag 代表的是第二层的意思1 AS Parent,--Parent的值代表了是Tag的父节点NULL, id,NULLFROM #tb WHERE id=1UNION ALLSELECT 3 AS Tag,2 AS Parent,NULL ,0,-1FOR 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 ALLSELECT 2 AS Tag,--这里的tag 代表的是第二层的意思1 AS Parent,--Parent的值代表了是Tag的父节点NULL, id,NULLFROM #tb WHERE id=1UNION ALLSELECT 3 AS Tag,2 AS Parent,NULL ,0,-1FOR XML EXPLICIT