FOR XML PATH и атрибуты xsi: nil - PullRequest
4 голосов
/ 23 июня 2011

Доброе утро всем,

У меня большой запрос, использующий FOR XML PATH для вывода XML-файла. У меня есть основной выбор, который в основном просто представляет корень, то есть

select *
from tbl
for xml path ('root'),elements xsinil

Затем у меня есть последующие вложенные выборки в этом главном выборе, т.е.

select 
    (
        select null [level1],
               '2'  [level2]
        from tbl
        for xml path('nested1'),type
    ),
    (
        select null [level1],
               '2'  [level2]
        from tbl
        for xml path('nested2'),type
    )
for xml path('root'),elements xsinil

Однако аргумент элемента xsinil, помещенный в путь for xml, не влияет на содержащиеся в нем подзапросы, т. Е. Элемент Level1 является просто закрытым тегом. Мне нужно, чтобы это отображалось как xsi: nil = "true".

Я могу добиться этого, добавив аргумент xsinil элементов в оператор пути for xml, например

for xml path('nested1'),type,elements xsinil

Проблема в том, что объявление пространства имен повторяется на уровне подзапроса.

Я могу найти множество примеров использования элементов xsinil, но ни одного, где это применимо к подзапросу без повторного объявления namesapce.

Для подтверждения я ищу следующий вывод:

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <nested1>
    <level1 xsi:nil="true">
    <level2>2</level2>
  </nested1>
  <nested2>
    <level1 xsi:nil="true">
    <level2>2</level2>
  </nested2>
</root>

Надеюсь, вы можете помочь!

1 Ответ

3 голосов
/ 23 июня 2011

Я не думаю, что это можно предотвратить с помощью подзапросов, использующих for xml path. О подобной проблеме сообщают здесь. https://connect.microsoft.com/SQLServer/feedback/details/265956/suppress-namespace-attributes-in-nested-select-for-xml-statements

Вы можете получить желаемый результат, если вместо этого будете использовать for xml explicit.

declare @T table(Level1 int, Level2 int)
insert into @T values(null, 2)

select 1    as Tag,
       null as Parent,
       null as [root!1],
       null as [nested1!2!level1!ELEMENTXSINIL],
       null as [nested1!2!level2!ELEMENTXSINIL],
       null as [nested2!3!level1!ELEMENTXSINIL],
       null as [nested2!3!level2!ELEMENTXSINIL]
union all
select 2    as Tag,
       1    as Parent,
       null,
       Level1,
       Level2,
       null,
       null
from @T       
union all
select 3    as Tag,
       1    as Parent,
       null,
       null,
       null,
       Level1,
       Level2
from @T       
for xml explicit       

Результат:

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <nested1>
    <level1 xsi:nil="true" />
    <level2>2</level2>
  </nested1>
  <nested2>
    <level1 xsi:nil="true" />
    <level2>2</level2>
  </nested2>
</root>
...