SQL Server FOR XML EXPLICIT с внутренними запросами

У меня есть следующий запрос, который производит вывод 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>

Мне нужно, чтобы данные были включены в cdata тег. Так что я использовал FOR XML EXPLICIT,

Когда я запускаю запрос, он выдает эту ошибку:

Запрос FOR XML EXPLICIT содержит недопустимое имя столбца ''. Используйте формат TAGNAME!TAGID!ATTRIBUTENAME[!..], где TAGID является положительным целым числом.

Я прошел много форумов, но они мне не помогли. Пожалуйста, кто-нибудь поможет мне в формулировании запроса или предоставит мне любые ссылки, которые помогут.

заранее спасибо

1 ответ

Решение

Чтобы использовать FOR XML EXPLICIT, необходимо указать иерархию узлов с запросами UNIONed, а не с вложенными. Результатом всех 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')
Другие вопросы по тегам