Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Вложенный XML и CROSS APPLY  [new]
Ученик9А
Guest
Добрый день!
Подскажите, пожалуйста, с разбором вложенного XML.
В каком направлении копать? Предполагаю, что я не правильно применяю CROSS APPLY.
Заранее благодарен!

DECLARE @xml XML = 
'<XMLData>			
<LongDirectory>
  <Category>
    <Item>
      <CategoryName>Cat1</CategoryName>
      <SubCategory>
        <Item>
          <Name>Name1</Name>
          <Value>Value1</Value>
        </Item>
        <Item>
          <Name>Name2</Name>
          <Value>Value2</Value>
        </Item>
        <Item>
          <Name>Name3</Name>
          <Value>Value3</Value>
        </Item>
      </SubCategory>
    </Item>
    <Item>
      <CategoryName>Cat2</CategoryName>
      <SubCategory>
        <Item>
          <Name>Name4</Name>
          <Value>Value4</Value>
        </Item>
        <Item>
          <Name>Name5</Name>
          <Value>Value5</Value>
        </Item>
      </SubCategory>
    </Item>
    <Item>
      <CategoryName>Cat3</CategoryName>
      <SubCategory>
        <Item>
          <Name>Name6</Name>
          <Value>Value6</Value>
        </Item>
        <Item>
          <Name>Name7</Name>
          <Value>Value7</Value>
        </Item>
      </SubCategory>
    </Item>
  </Category>
</LongDirectory>
</XMLData>'

DECLARE @CategoryName nvarchar(32),
		@Name	nvarchar(32),
		@Value	nvarchar(32);

SELECT
	@CategoryName = t.c.value('CategoryName[1]', 'NVARCHAR(32)')
	,@Name = t1.c1.value('Name[1]', 'NVARCHAR(32)')
	,@Value = t1.c1.value('Value[1]', 'NVARCHAR(32)')
FROM @xml.nodes('XMLData/LongDirectory/Category/Item') as t(c)
CROSS APPLY 
t.c.nodes('SubCategory/Item') as t1(c1);

select 
@Name AS Name 
,@Value AS  Value
,@CategoryName AS Category;


--результат выполнения 

Name    Value    Category
-------------------------
Name7  Value7   Cat3


--необходимо получить 

Name    Value    Category
-------------------------
Name1   Value1   Cat1
Name2   Value2   Cat1
Name3   Value3   Cat1
Name4   Value4   Cat2
Name5   Value5   Cat2
Name6   Value6   Cat3
Name7   Value7   Cat3
6 окт 16, 10:10    [19749257]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный XML и CROSS APPLY  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
SELECT
	 t.c.value('CategoryName[1]', 'NVARCHAR(32)')
	,t1.c1.value('Name[1]', 'NVARCHAR(32)')
	,t1.c1.value('Value[1]', 'NVARCHAR(32)')
FROM @xml.nodes('XMLData/LongDirectory/Category/Item') as t(c)
CROSS APPLY 
t.c.nodes('SubCategory/Item') as t1(c1);
6 окт 16, 10:56    [19749436]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный XML и CROSS APPLY  [new]
Ученик9А
Guest
Спасибо большое!!
6 окт 16, 11:18    [19749507]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить