--使用 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