2016-06-12 15 views
0

У меня есть база данных с 5 таблицами. 3 таблицы подключаются.Создание динамического многоуровневого XML-файла из таблицы SQL Server

Создайте таблицу, в которой все данные будут объединены. В этой таблице есть столбец GroupLevel, который имеет затем уровень nr. Каждый уровень имеет следующий нижний уровень, например. группа 1 имеет группу 2.

Первые из моих таблиц содержат продукты:

ProductID ProductLanguageID ProductDefaultShopID ProductNumber ProductName ProductPrice 
    [email protected]@SHOP1 LANG2   SHOP1     100101   AAA   159,61 
    [email protected]@SHOP1 LANG2   SHOP1     100102   BBB   159,61 
    [email protected]@SHOP1 LANG2   SHOP1     100105   CCC   159,61 

вторых имеют группы:

GroupID   GroupLanguageID  GroupName GroupNumber 
[email protected]@SHOP1 LANG2    ABC  1 
[email protected]@SHOP1 LANG2    BCD 1.01 
[email protected]@SHOP1 LANG2    CDE 1.02 
[email protected]@SHOP1 LANG2    DEF 1.03 

третьих язык

LanguageID LanguageCode2 LanguageName LanguageNativeName 
LANG1   En   English   English 
LANG2   De   German   Deutsch 

Я также 2 таблицы, которые не имеют никаких подключений к другим таблицам:

отношения Группа Таблица

GroupRelationsGroupID GroupRelationsParentID 
[email protected]@SHOP1   [email protected]@SHOP1 
[email protected]@SHOP1   [email protected]@SHOP1 
[email protected]@SHOP1   [email protected]@SHOP1 

Группа Соотношение продукта Таблица

GroupProductRelationGroupID GroupProductRelationProductID 
[email protected]@SHOP1     [email protected]@SHOP1 
[email protected]@SHOP1     [email protected]@SHOP1 
[email protected]@SHOP1     [email protected]@SHOP1 
[email protected]@SHOP1     [email protected]@SHOP1 
[email protected]@SHOP1     [email protected]@SHOP1 
[email protected]@SHOP1     [email protected]@SHOP1 
[email protected]@SHOP1     [email protected]@SHOP1 
[email protected]@SHOP1     [email protected]@SHOP1 

Я создал одну таблицу, где объединены все данные. Эта таблица имеет столбец GroupLevel, который содержит уровень nr. Каждый уровень имеет следующий нижний уровень, например. группа 1 имеет группу 2, как и в таблице ниже

GroupLevel GroupID GroupLanguageID GroupName GroupNumber ParentGroupID GroupProductRelationGroupID GroupProductRelationProductID ProductID ProductLanguageID ProductNumber ProductName ProductPrice 
1  [email protected]@SHOP1 LANG2   ABC 1   NULL   NULL     NULL       NULL   NULL    NULL   NULL   NULL 
2  [email protected]@SHOP1 LANG2   BCD 1.01   [email protected]@SHOP1  [email protected]@SHOP1    [email protected]@SHOP1    [email protected]@SHOP1 LANG2    457163  ProductName 299,81 
2  [email protected]@SHOP1 LANG2   BCD 1.01   [email protected]@SHOP1  [email protected]@SHOP1    [email protected]@SHOP1    [email protected]@SHOP1 LANG2    457162  ProductName 163,14 
2  [email protected]@SHOP1 LANG2   DEF 1.03   [email protected]@SHOP1  [email protected]@SHOP1    [email protected]@SHOP1    [email protected]@SHOP1 LANG2    159151  ProductName 10 
2  [email protected]@SHOP1 LANG2   DEF 1.03   [email protected]@SHOP1  [email protected]@SHOP1    [email protected]@SHOP1    [email protected]@SHOP1 LANG2    159150  ProductName 10 
2  [email protected]@SHOP1 LANG2   DEF 1.02   [email protected]@SHOP1  [email protected]@SHOP1    [email protected]@SHOP1    [email protected]@SHOP1 LANG2    159122  ProductName 309,35 
3  [email protected]@SHOP1 LANG2   GGG 1.13   [email protected]@SHOP1 [email protected]@SHOP1    [email protected]@SHOP1    [email protected]@SHOP1LANG2    3459652 ProductName 309,35 
4  [email protected]@SHOP1 LANG2   BBB 1.14   [email protected]@SHOP1 [email protected]@SHOP1    [email protected]@SHOP1    [email protected]@SHOP1 LANG2    564326  ProductName 309,35       

Мой вопрос заключается в том, чтобы создать динамический XML-файл с макс 3 уровня, где все элементы на уровнях после третьего объеденены к (входит в) 3 уровень. Мне также нужно, чтобы каждый элемент этих уровней (те, что слились с третьим) имел атрибут, который говорит/показывает, на каком уровне они первоначально принадлежали. Так, например, если бы у меня было 5 уровней, а уровни 4 и 5, слитые в 3-й уровень, все элементы уровня 4 должны иметь тег, говорящий «ранее на уровне 4» и с уровня 5 «ранее на уровне 5». Это должно работать независимо от количества уровней.

Я создал код, но он не работает, как требуется

SELECT lvl1.GroupName AS groupName, lvl1.GroupNumber 
     ,(
      SELECT prod1.ProductName AS itemName 
      ,prod1.ProductNumber AS itemNumber, 
      prod1.ProductPrice AS itemPrice, 
      prod1.GroupID, 
      prod1.GroupName      
      FROM #tmpFullResult AS prod1 
      WHERE prod1.GroupLevel=1 
      AND prod1.GroupID=lvl1.GroupID    
      FOR XML PATH('product'),ROOT('products'),TYPE 
       ) 
       ,( 

     SELECT lvl2.GroupName AS groupName, lvl2.GroupNumber 
      ,(

    SELECT prod.ProductName AS '@id' ,prod.ProductNumber AS itemNumber 
      ,prod.ProductPrice AS itemPrice 
    FROM #tmpFullResult AS prod 
    WHERE prod.ProductID IS NOT NULL 
     AND prod.GroupLevel=2 
     AND prod.ProductID=lvl2.ProductID 
     AND prod.GroupID=lvl2.GroupID 
     FOR XML PATH('product'),ROOT('products'),TYPE 
     )      
     FROM #tmpFullResult AS lvl2 
     WHERE lvl2.GroupLevel=2 
     AND lvl2.ParentGroupID=lvl1.GroupID 
     group by lvl2.GroupName , lvl2.GroupNumber,lvl2.GroupID, lvl2.ProductID 
     FOR XML PATH('productGroup2'),TYPE 
     )   
FROM #tmpFullResult AS lvl1 
WHERE lvl1.ParentGroupID IS NULL 
group by lvl1.GroupName , lvl1.GroupNumber,lvl1.GroupID, lvl1.ProductID 
FOR XML PATH('productgroup1'),ROOT('root') 

GO 

пример того, как мне нужно сделать:

select '<?xml version="1.0" encoding="ISO-8859-1" ?>' + 
(

SELECT lvl1.GroupName AS groupName 
     ,(
       SELECT prod1.ProductName, prod1.ProductNumber AS itemNumber 
       ,prod1.ProductPrice AS itemPrice 
       FROM tmpFullResultInDesign AS prod1 
       WHERE prod1.ProductID IS NOT NULL 
       AND prod1.GroupLevel=1 
       AND prod1.ProductID=lvl1.ProductID 
       AND prod1.GroupID=lvl1.GroupID 


       FOR XML PATH('productLevel_1'),ROOT('products'),TYPE 
       ) 
       ,( 
SELECT lvl2.GroupName AS 'GroupName' 
       ,(
       SELECT prod2.ProductName AS ProductName ,prod2.ProductNumber AS itemNumber 
       ,prod2.ProductPrice AS itemPrice, prod2.GroupID 
       FROM tmpFullResultInDesign AS prod2 
       WHERE prod2.ProductID IS NOT NULL 
       AND prod2.GroupLevel=2 
       AND prod2.ProductID=lvl2.ProductID 
       AND prod2.GroupID=lvl2.GroupID 
       order by groupName 
       FOR XML PATH('productLevel_2'),ROOT('products'),TYPE 
       ) 
       ,(
SELECT lvl3.GroupName AS groupName 
       ,(
       SELECT prod.ProductName AS '@id' ,prod.ProductNumber AS itemNumber 
       ,prod.ProductPrice AS itemPrice  
       FROM tmpFullResultInDesign AS prod 
       WHERE prod.ProductID IS NOT NULL 
       AND prod.GroupLevel=3 
       AND prod.ProductID= lvl3.ProductID 
       AND prod.GroupID=lvl3.GroupID 
       FOR XML PATH('productLevel_3'),ROOT('products'),TYPE 
       )    
       ,(

       SELECT prod.ProductName AS '@id' ,prod.ProductNumber AS itemNumber 
       ,prod.ProductPrice AS itemPrice 
       FROM tmpFullResultInDesign AS prod 
       WHERE prod.ProductID IS NOT NULL 
       AND prod.GroupLevel=3 
       FOR XML PATH('productLevel_previously_level_4'),ROOT('products'),TYPE 
       ) 

,(

       SELECT prod.ProductName AS '@id' ,prod.ProductNumber AS itemNumber 
       ,prod.ProductPrice AS itemPrice 
       FROM tmpFullResultInDesign AS prod 
       WHERE prod.ProductID IS NOT NULL 
       AND prod.GroupLevel=5 
       FOR XML PATH('productLevel_previously_level_5'),ROOT('products'),TYPE 
       ) 

FROM tmpFullResultInDesign AS lvl3 
WHERE lvl3.GroupLevel=3 
AND lvl3.ParentGroupID=lvl2.GroupID 
FOR XML PATH('productGroup3'),TYPE, ELEMENTS 
       )  
FROM tmpFullResultInDesign AS lvl2 
WHERE lvl2.GroupLevel=2 
AND lvl2.ParentGroupID=lvl1.GroupID 
order by lvl2.GroupName 
FOR XML PATH('productGroup2'),TYPE, ELEMENTS 
       )  
FROM tmpFullResultInDesign AS lvl1 
WHERE lvl1.ParentGroupID IS NULL 
order by GroupNumber 
FOR XML PATH('productGroup1'),ROOT('root') 
) 

Вывод в XML Как в этом примере:

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
     <productGroup1> 
       <groupName>Kosmetik</groupName> 
       <productGroup2> 
        <GroupName>Face</GroupName> 
        <products> 
          <productLevel_2 id="Product1"> 
            <ProductName>AAAAA!</ProductName> 
            <itemNumber>457162</itemNumber> 
            <itemPrice>1.02</itemPrice> 
            <GroupID>[email protected]@SHOP1</GroupID> 
           </productLevel_2> 
          <productLevel_2 id="Product2"> 
            <ProductName>BBBBB!</ProductName> 
            <itemNumber>43434234</itemNumber> 
            <itemPrice>134.3434</itemPrice> 
            <GroupID>[email protected]@SHOP1</GroupID> 
           </productLevel_2> 
         </products> 
        <productGroup3> 
          <groupName>FFFFFFF</groupName> 
          <products> 
            <productLevel_3 id="Product1"> 
              <itemNumber>[email protected]</itemNumber> 
              <itemPrice>1.230000000000000e+002</itemPrice> 
             </productLevel_3> 
           </products> 
          <products> 
            <productLevel_previously_level_4 id="Product1"> 
              <itemNumber>23234545</itemNumber> 
              <itemPrice>34.676</itemPrice> 
             </productLevel_previously_level_4> 
            <productLevel_previously_level_4 id="Product2"> 
              <itemNumber>23234545</itemNumber> 
              <itemPrice>34.676</itemPrice> 
             </productLevel_previously_level_4> 
           </products> 
         </productGroup3> 
       </productGroup2> 
      </productGroup1> 
    </root> 

Вопрос Объяснение: Мне нужно работать w с n уровнями (т.е. уровень n + 1 должен перейти на уровень n). Я стараюсь, чтобы еще раз объяснить ... У меня есть продукты на нескольких уровнях:

level 1 + products 
level 2 + products 
level 3 + products ... 
level n + products. 

Идея заключается в том, если я выбираю 1 уровень, все продукты от уровня больше, чем 1 (то есть 2, 3, 4 ... п) агрегируются на уровне 1:

<productGroup1 GroupID="[email protected]@SHOP1"> 
     <GroupName>AAA</GroupName> 
     <GroupLevel>1</GroupLevel> 
     <products> 
       <product> 
        <ProductName>CCC</ProductName> 
       </product> 
      </products> 
     <products> 
       <product> 
        <ProductName>Mem</ProductName> 
       </product> 
      </products> 
    </productGroup1> 

Если я выбираю 2-го уровня, уровень 1 цела и все продукты от уровня больше, чем 2 (то есть 3, 4 ... п) агрегируются на уровне 2. То же самое касается всех уровней (нет предела).

Можно ли положить CTE в хранимую процедуру?

+0

Можете ли вы предоставить образец «объединенного» XML? – Alex

ответ

1

Я взял свой «пример того, как мне нужно делать» и заменить уровень 4 и уровень 5 запросов с этим:

-- Levels 3+ 
SELECT prod.ProductName AS '@id', prod.GroupLevel AS '@PreviousGroupLevel', prod.ProductNumber AS itemNumber, 
    prod.ProductPrice AS itemPrice 
FROM #tmpFullResult AS prod 
WHERE prod.ProductID IS NOT NULL 
    AND prod.GroupLevel>= 3 
--FOR XML PATH('productLevel_previously_level_4'),ROOT('products'),TYPE 
FOR XML PATH('productLevel_HigherLevels'),ROOT('products'),TYPE 

В приведенном выше, заметьте, что я использую атрибут «@ PreviousGroupLevel "и что XML PATH изменен на" productLevel_HigherLevels ".
Общий запрос ниже (это требует #tmpFullResult таблицу):

SELECT lvl1.GroupName AS groupName, 
    (
     SELECT prod1.ProductName, prod1.ProductNumber AS itemNumber 
      ,prod1.ProductPrice AS itemPrice 
     FROM #tmpFullResult AS prod1 
     WHERE prod1.ProductID IS NOT NULL 
      AND prod1.GroupLevel = 1 
      AND prod1.ProductID = lvl1.ProductID 
      AND prod1.GroupID = lvl1.GroupID 
     FOR XML PATH('productLevel_1'),ROOT('products'),TYPE 
    ), 
    ( 
     SELECT lvl2.GroupName AS 'GroupName', 
      (
       SELECT prod2.ProductName AS ProductName ,prod2.ProductNumber AS itemNumber, 
        prod2.ProductPrice AS itemPrice, prod2.GroupID 
       FROM #tmpFullResult AS prod2 
       WHERE prod2.ProductID IS NOT NULL 
        AND prod2.GroupLevel=2 
        AND prod2.ProductID=lvl2.ProductID 
        AND prod2.GroupID=lvl2.GroupID 
       ORDER BY groupName 
       FOR XML PATH('productLevel_2'),ROOT('products'),TYPE 
      ), 
      (
       SELECT lvl3.GroupName AS groupName 
        ,(
         SELECT prod.ProductName AS '@id' ,prod.ProductNumber AS itemNumber, 
          prod.ProductPrice AS itemPrice  
         FROM #tmpFullResult AS prod 
         WHERE prod.ProductID IS NOT NULL 
          AND prod.GroupLevel = 3 
          AND prod.ProductID = lvl3.ProductID 
          AND prod.GroupID = lvl3.GroupID 
         FOR XML PATH('productLevel_3'),ROOT('products'),TYPE 
        )    
        ,(
         -- Levels 3+ 
         SELECT prod.ProductName AS '@id', prod.GroupLevel AS '@PreviousGroupLevel', prod.ProductNumber AS itemNumber, 
          prod.ProductPrice AS itemPrice 
         FROM #tmpFullResult AS prod 
         WHERE prod.ProductID IS NOT NULL 
          AND prod.GroupLevel>= 3 
         --FOR XML PATH('productLevel_previously_level_4'),ROOT('products'),TYPE 
         FOR XML PATH('productLevel_HigherLevels'),ROOT('products'),TYPE 
        )/*, 
        (
         SELECT prod.ProductName AS '@id' ,prod.ProductNumber AS itemNumber, 
          prod.ProductPrice AS itemPrice 
         FROM #tmpFullResult AS prod 
         WHERE prod.ProductID IS NOT NULL 
          AND prod.GroupLevel=5 
         FOR XML PATH('productLevel_previously_level_5'),ROOT('products'),TYPE 
        )*/ 
       FROM #tmpFullResult AS lvl3 
       WHERE lvl3.GroupLevel=3 
       AND lvl3.ParentGroupID=lvl2.GroupID 
       FOR XML PATH('productGroup3'),TYPE, ELEMENTS 
      )  
     FROM #tmpFullResult AS lvl2 
     WHERE lvl2.GroupLevel=2 
     AND lvl2.ParentGroupID=lvl1.GroupID 
     order by lvl2.GroupName 
     FOR XML PATH('productGroup2'),TYPE, ELEMENTS 
    )  
FROM #tmpFullResult AS lvl1 
WHERE lvl1.ParentGroupID IS NULL 
order by GroupNumber 
FOR XML PATH('productGroup1'),ROOT('root') 

Я надеюсь, что это то, что вы искали.

Обновление: Образец данных:

CREATE TABLE #tmpFullResult(GroupLevel INT, GroupID VARCHAR(20) NULL, 
    GroupLanguageID VARCHAR(20) NULL, GroupName VARCHAR(20) NULL, 
    GroupNumber DECIMAL(10, 3) NULL, ParentGroupID VARCHAR(20) NULL, 
    GroupProductRelationGroupID VARCHAR(20) NULL, 
    GroupProductRelationProductID VARCHAR(20) NULL, 
    ProductID VARCHAR(20) NULL, ProductLanguageID VARCHAR(10) NULL, 
    ProductNumber INT NULL, ProductName VARCHAR(20) NULL, ProductPrice DECIMAL(20, 4) NULL) 

INSERT INTO #tmpFullResult 
VALUES 
(1, '[email protected]@SHOP1', 'LANG2', 'ABC', 1, NULL,   NULL,   NULL,   NULL,   NULL, NULL,  NULL,   NULL), 
(2, '[email protected]@SHOP1', 'LANG2', 'BCD', 1.01, '[email protected]@SHOP1', '[email protected]@SHOP1', '[email protected]@SHOP1', '[email protected]@SHOP1', 'LANG2', 457163,  'ProductName', 299.81), 
(2, '[email protected]@SHOP1', 'LANG2', 'BCD', 1.01, '[email protected]@SHOP1', '[email protected]@SHOP1', '[email protected]@SHOP1', '[email protected]@SHOP1', 'LANG2', 457162,  'ProductName', 163.14), 
(2, '[email protected]@SHOP1', 'LANG2', 'DEF', 1.03, '[email protected]@SHOP1', '[email protected]@SHOP1', '[email protected]@SHOP1', '[email protected]@SHOP1', 'LANG2', 159151,  'ProductName', 10), 
(2, '[email protected]@SHOP1', 'LANG2', 'DEF', 1.03, '[email protected]@SHOP1', '[email protected]@SHOP1', '[email protected]@SHOP1', '[email protected]@SHOP1', 'LANG2', 159150,  'ProductName', 10), 
(2, '[email protected]@SHOP1', 'LANG2', 'DEF', 1.02, '[email protected]@SHOP1', '[email protected]@SHOP1', '[email protected]@SHOP1', '[email protected]@SHOP1', 'LANG2', 159122,  'ProductName', 309.35), 
(3, '[email protected]@SHOP1', 'LANG2', 'GGG', 1.13, '[email protected]@SHOP1', '[email protected]@SHOP1', '[email protected]@SHOP1','[email protected]@SHOP1','LANG2', 3459652, 'ProductName', 309.35), 
(4, '[email protected]@SHOP1', 'LANG2', 'BBB', 1.14, '[email protected]@SHOP1', '[email protected]@SHOP1', '[email protected]@SHOP1', '[email protected]@SHOP1', 'LANG2', 564326,  'ProductName', 309.35), 
(5, '[email protected]@SHOP1', 'LANG2', 'BBB', 1.14, '[email protected]@SHOP1', '[email protected]@SHOP1', '[email protected]@SHOP1', '[email protected]@SHOP1', 'LANG2', 564326,  'ProductName', 309.35), 
(3, '[email protected]@SHOP1', 'LANG2', 'GGG', 1.13, '[email protected]@SHOP1', '[email protected]@SHOP1', '[email protected]@SHOP1','[email protected]@SHOP1','LANG2', 3459652, 'ProductName', 309.35), 
(4, '[email protected]@SHOP1', 'LANG2', 'BBB', 1.14, '[email protected]@SHOP1', '[email protected]@SHOP1', '[email protected]@SHOP1', '[email protected]@SHOP1', 'LANG2', 564326,  'ProductName', 309.35), 
(5, '[email protected]@SHOP1', 'LANG2', 'BBB', 1.14, '[email protected]@SHOP1', '[email protected]@SHOP1', '[email protected]@SHOP1', '[email protected]@SHOP1', 'LANG2', 564326,  'ProductName', 309.35) 

Ниже запроса аналогична описанной выше, за исключением того, что я добавил КТР для расчета GroupLevel 3 ParentId для всех высших групп уровня:

;WITH productLevel_HigherLevels(GroupLevel, GroupID, GroupLanguageID, GroupName, GroupNumber, ParentGroupID, 
     GroupProductRelationGroupID, GroupProductRelationProductID, ProductID, ProductLanguageID, 
     ProductNumber, ProductName, ProductPrice) 
AS 
-- Define the CTE query. 
( 
    SELECT GroupLevel, GroupID, GroupLanguageID, GroupName, GroupNumber, ParentGroupID, 
     GroupProductRelationGroupID, GroupProductRelationProductID, ProductID, ProductLanguageID, 
     ProductNumber, ProductName, ProductPrice 
    FROM #tmpFullResult 
    WHERE GroupLevel = 4 AND ProductID IS NOT NULL 
    UNION ALL 
    SELECT HigherLevel.GroupLevel, HigherLevel.GroupID, HigherLevel.GroupLanguageID, HigherLevel.GroupName, HigherLevel.GroupNumber, LowerLevel.ParentGroupID, 
     HigherLevel.GroupProductRelationGroupID, HigherLevel.GroupProductRelationProductID, HigherLevel.ProductID, HigherLevel.ProductLanguageID, 
     HigherLevel.ProductNumber, HigherLevel.ProductName, HigherLevel.ProductPrice 
    FROM productLevel_HigherLevels AS LowerLevel 
     INNER JOIN #tmpFullResult AS HigherLevel 
       ON HigherLevel.ProductID IS NOT NULL 
        AND LowerLevel.GroupLevel + 1 = HigherLevel.GroupLevel 
        AND HigherLevel.ParentGroupID = LowerLevel.GroupID 
) 
SELECT lvl1.GroupName AS groupName, 
    (
     SELECT prod1.ProductName, prod1.ProductNumber AS itemNumber 
      ,prod1.ProductPrice AS itemPrice 
     FROM #tmpFullResult AS prod1 
     WHERE prod1.ProductID IS NOT NULL 
      AND prod1.GroupLevel = 1 
      AND prod1.ProductID = lvl1.ProductID 
      AND prod1.GroupID = lvl1.GroupID 
     FOR XML PATH('productLevel_1'),ROOT('products'),TYPE 
    ), 
    ( 
     SELECT lvl2.GroupName AS 'GroupName', 
      (
       SELECT prod2.ProductName AS ProductName ,prod2.ProductNumber AS itemNumber, 
        prod2.ProductPrice AS itemPrice, prod2.GroupID 
       FROM #tmpFullResult AS prod2 
       WHERE prod2.ProductID IS NOT NULL 
        AND prod2.GroupLevel=2 
        AND prod2.ProductID=lvl2.ProductID 
        AND prod2.GroupID=lvl2.GroupID 
       ORDER BY groupName 
       FOR XML PATH('productLevel_2'),ROOT('products'),TYPE 
      ), 
      (
       SELECT lvl3.GroupName AS groupName 
        ,(
         SELECT prod.ProductName AS '@id' ,prod.ProductNumber AS itemNumber, 
          prod.ProductPrice AS itemPrice  
         FROM #tmpFullResult AS prod 
         WHERE prod.ProductID IS NOT NULL 
          AND prod.GroupLevel = 3 
          AND prod.ProductID = lvl3.ProductID 
          AND prod.GroupID = lvl3.GroupID 

         FOR XML PATH('productLevel_3'),ROOT('products'),TYPE 
        )    
        ,(
         SELECT prod.ProductName AS '@id', prod.GroupLevel AS '@PreviousGroupLevel', prod.ProductNumber AS itemNumber, 
          prod.ProductPrice AS itemPrice 
         FROM productLevel_HigherLevels AS prod 
         WHERE prod.ParentGroupID = lvl3.GroupID 
         --FOR XML PATH('productLevel_previously_level_4'),ROOT('products'),TYPE 
         FOR XML PATH('productLevel_HigherLevels'),ROOT('products'),TYPE 
        )/*, 
        (
         SELECT prod.ProductName AS '@id' ,prod.ProductNumber AS itemNumber, 
          prod.ProductPrice AS itemPrice 
         FROM #tmpFullResult AS prod 
         WHERE prod.ProductID IS NOT NULL 
          AND prod.GroupLevel=5 
         FOR XML PATH('productLevel_previously_level_5'),ROOT('products'),TYPE 
        )*/ 
       FROM #tmpFullResult AS lvl3 
       WHERE lvl3.GroupLevel=3 
       AND lvl3.ParentGroupID=lvl2.GroupID 
       FOR XML PATH('productGroup3'),TYPE, ELEMENTS 
      )  
     FROM #tmpFullResult AS lvl2 
     WHERE lvl2.GroupLevel=2 
     AND lvl2.ParentGroupID=lvl1.GroupID 
     order by lvl2.GroupName 
     FOR XML PATH('productGroup2'),TYPE, ELEMENTS 
    )  
FROM #tmpFullResult AS lvl1 
WHERE lvl1.ParentGroupID IS NULL 
order by GroupNumber 
FOR XML PATH('productGroup1'),ROOT('root') 
+0

Привет, спасибо за ваш ответ! Проблема с вашим решением для уровня 3+ заключается в том, что все продукты (уровень 3+) повторяются в каждой группе продуктов (если у меня есть 3 группы продуктов второго уровня, но только одна группа продуктов имеет продукты на уровне 3+, я могу видеть эти продукты в все группы продуктов, которые ошибаются.) - Антон Треддер 6 часов назад –

+0

@ Антон Треддер, я обновил свой ответ. – Alex

+0

Hi @Alex, мне очень жаль, но код по-прежнему не работает, как мне было нужно. Предложение вашего кода велико, но оно работает только до уровня 4 (уровень 4 переходит на уровень 3), но мне нужно работать с n уровнями (то есть уровень n + 1 должен идти до уровня n). Я пытаюсь объяснить еще раз ... Если у меня есть продукты на нескольких уровнях: продукты уровня 1 продуктов уровня 2 продуктов уровня 3 ... уровня n продуктов .... Я обновил свой вопрос. –