具有内部查询的 Sql Server FOR XML EXPLICIT

Sql Server FOR XML EXPLICIT with inner queries

提问人:user3859628 提问时间:7/21/2014 最后编辑:marc_suser3859628 更新时间:7/22/2014 访问量:1567

问:

我有以下查询,它产生XML输出:

select Top 10 1 as tag,
    null as parent, 
    property_name as [Property!1!PropertyName!cdata], 
        (select 2 as tag, 
                1 as parent, 
                 null as [Subdivision!2!SubdivisionName!cdata] 
            from subdivision s 
           where s.subdivision_id=p.fk_subdivision_id
        FOR XML EXPLICIT) 
from property p
FOR XML EXPLICIT,root('Properties')

我期望的结果是:

<Properties>
   <Property>
       <PropertyName><![CDATA[Test Property]]></PropertyName>
       <Subdivision>
          <SubdivisionName><![CDATA[Test Subdivision]]</SubdivisionName>
       </Subdivision>
   </Property>     
</Properties>

我需要将数据包含在标签中。所以我用了.cdataFOR XML EXPLICIT

当我运行查询时,它给出了以下错误:

FOR XML EXPLICIT 查询包含无效的列名 ''。使用 TAGNAME!塔吉德!ATTRIBUTENAME[..] 格式,其中 TAGID 为正整数。

我浏览过许多论坛,但它们对我没有帮助。请任何人帮助我构建查询或向我提供任何有帮助的链接。

提前致谢

sql-server-2008 子查询 cdata inner-query for-xml-explicit

评论


答:

1赞 Muqo 7/22/2014 #1

若要使用 FOR XML EXPLICIT,需要使用 UNION 查询(而不是嵌套查询)指定节点的层次结构。所有 UNION 的结果都是一个表,表示 XML 的树结构,从无父根开始。参考: http://msdn.microsoft.com/en-us/library/ms189068%28v=sql.100%29.aspx

SELECT
    1 AS Tag,
    NULL AS Parent, 
    p.property_name AS [Property!1!PropertyName!cdata],
    NULL AS [Subdivision!2!SubdivisionName!cdata]
FROM
    property p
UNION ALL
SELECT
    2 AS Tag,
    1 AS Parent,
    NULL AS [Property!1!PropertyName!cdata],
    s.subdivision_name AS [Subdivision!2!SubdivisionName!cdata]
FROM
    property p
INNER JOIN
    subdivision s
ON
    s.subdivision_id = p.fk_subdivision_id
FOR XML EXPLICIT, ROOT('Properties')