【问题标题】:Generate dynamic multilevel XML file from SQL Server table从 SQL Server 表生成动态多级 XML 文件
【发布时间】:2016-10-12 22:08:30
【问题描述】:

我有一个包含 5 个表的数据库。 3 个表已连接。

我创建了一张所有数据都合并的表。此表有一个列 GroupLevel,该列保存然后级别 nr。每个级别都包含随后的较低级别,例如第 1 组拥有第 2 组。

我的第一个表包含产品:

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

第二个有组:

GroupID         GroupLanguageID      GroupName  GroupNumber
1@@SHOP1    LANG2                ABC        1
1.01@@SHOP1 LANG2                BCD    1.01
1.02@@SHOP1 LANG2                CDE    1.02
1.03@@SHOP1 LANG2                DEF    1.03

第三种语言

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

我还有 2 个表与其他表没有任何连接:

组关系表

GroupRelationsGroupID   GroupRelationsParentID
1.01@@SHOP1         1@@SHOP1
1.02@@SHOP1         1@@SHOP1
1.02@@SHOP1         1@@SHOP1

集团产品关系表

GroupProductRelationGroupID GroupProductRelationProductID
1.01@@SHOP1                 576134@@SHOP1
1.01@@SHOP1                 327112@@SHOP1
1.01@@SHOP1                 457168@@SHOP1
1.01@@SHOP1                 457220@@SHOP1
1.03@@SHOP1                 457221@@SHOP1
1.03@@SHOP1                 163704@@SHOP1
1.03@@SHOP1                 163705@@SHOP1
1.03@@SHOP1                 163706@@SHOP1

我创建了一张表,所有数据都在其中合并。该表有一个 GroupLevel 列,其中包含一个级别 nr。每个级别都包含随后的较低级别,例如第 1 组包含第 2 组,如下表所示

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

我的问题是如何创建一个具有最多 3 个级别的动态 XML 文件,其中第三个级别之后的级别上的所有项目都合并到(包含到)第 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>1.01@@SHOP1</GroupID>
                               </productLevel_2>
                            <productLevel_2 id="Product2">
                                   <ProductName>BBBBB!</ProductName>
                                   <itemNumber>43434234</itemNumber>
                                   <itemPrice>134.3434</itemPrice>
                                   <GroupID>1.01@@SHOP1</GroupID>
                               </productLevel_2>
                        </products>
                     <productGroup3>
                            <groupName>FFFFFFF</groupName>
                            <products>
                                   <productLevel_3 id="Product1">
                                          <itemNumber>123@1</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>

问题说明: 我需要处理 n 个级别(即第 n+1 级应该进入第 n 级)。我试着再解释一次…… 我有几个级别的产品:

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

这个想法是,如果我选择 1 级,所有大于 1 级的产品(即 2、3、4...n)都会聚合到 1 级:

<productGroup1 GroupID="10@@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...n)都聚合到 2 级。 所有级别都应如此(没有限制)。

我可以将 CTE 放入存储过程吗?

【问题讨论】:

  • 你能提供一个“合并”的 XML 示例吗?

标签: sql-server xml merge


【解决方案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')

我希望这是您一直在寻找的。​​p>

更新: 样本数据:

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, '1@@SHOP1',    'LANG2', 'ABC',    1,  NULL,           NULL,         NULL,            NULL,            NULL,   NULL,        NULL,          NULL ),
( 2, '1.01@@SHOP1', 'LANG2', 'BCD', 1.01, '1@@SHOP1',    '1.01@@SHOP1', '457163@@SHOP1', '457163@@SHOP1', 'LANG2', 457163,     'ProductName', 299.81 ),
( 2, '1.01@@SHOP1', 'LANG2', 'BCD', 1.01, '1@@SHOP1',    '1.01@@SHOP1', '457162@@SHOP1', '457162@@SHOP1', 'LANG2', 457162,     'ProductName', 163.14 ),
( 2, '1.03@@SHOP1', 'LANG2', 'DEF', 1.03, '1@@SHOP1',    '1.03@@SHOP1', '159151@@SHOP1', '159151@@SHOP1', 'LANG2', 159151,     'ProductName', 10 ),
( 2, '1.03@@SHOP1', 'LANG2', 'DEF', 1.03, '1@@SHOP1',    '1.03@@SHOP1', '159150@@SHOP1', '159150@@SHOP1', 'LANG2', 159150,     'ProductName', 10 ),
( 2, '1.03@@SHOP1', 'LANG2', 'DEF', 1.02, '1@@SHOP1',    '1.03@@SHOP1', '159122@@SHOP1', '159122@@SHOP1', 'LANG2', 159122,     'ProductName', 309.35 ),
( 3, '1.13@@SHOP1', 'LANG2', 'GGG', 1.13, '1.03@@SHOP1', '1.03@@SHOP1', '3459652@@SHOP1','3459652@@SHOP1','LANG2', 3459652,    'ProductName', 309.35 ), 
( 4, '1.14@@SHOP1', 'LANG2', 'BBB', 1.14, '1.13@@SHOP1', '1.13@@SHOP1', '564326@@SHOP1', '564326@@SHOP1', 'LANG2', 564326,     'ProductName', 309.35 ),
( 5, '1.15@@SHOP1', 'LANG2', 'BBB', 1.14, '1.14@@SHOP1', '1.13@@SHOP1', '564326@@SHOP1', '564326@@SHOP1', 'LANG2', 564326,     'ProductName', 309.35 ),
( 3, '1.23@@SHOP1', 'LANG2', 'GGG', 1.13, '1.01@@SHOP1', '1.03@@SHOP1', '3459652@@SHOP1','3459652@@SHOP1','LANG2', 3459652,    'ProductName', 309.35 ), 
( 4, '1.24@@SHOP1', 'LANG2', 'BBB', 1.14, '1.23@@SHOP1', '1.13@@SHOP1', '564326@@SHOP1', '564326@@SHOP1', 'LANG2', 564326,     'ProductName', 309.35 ),
( 5, '1.25@@SHOP1', 'LANG2', 'BBB', 1.14, '1.24@@SHOP1', '1.13@@SHOP1', '564326@@SHOP1', '564326@@SHOP1', 'LANG2', 564326,     'ProductName', 309.35 )

下面的查询与上面的查询类似,只是我添加了一个 CTE 来计算所有更高级别组的 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')

【讨论】:

  • 您好,谢谢您的回答!您对 3+ 级别的解决方案的问题是每个产品组中的所有产品(3+ 级)都重复(如果我有 3 个产品组第二级但只有一个产品组具有 3+ 级的产品,我可以在所有产品组都是错误的。) – Anton Tredder 6 小时前
  • 嗨@Alex,我很抱歉,但代码仍然没有真正按照我的需要工作。您的代码建议很棒,但它只在第 4 级(第 4 级到第 3 级)之前有效,但我需要使用 n 级(即第 n+1 级应该到第 n 级)。我再次尝试解释...如果我有多个级别的产品:级别 1 产品级别 2 产品级别 3 产品...级别 n 产品....我更新了我的问题。
  • @Anton Tredder,首先我的代码适用于高于 4 的级别。你试过吗?其次,尝试对您的问题进行重大更改并不好,因为您已经回答了原始问题(“......如何创建一个最多 3 个级别的动态 XML 文件,其中所有项目在级别之后第三个被合并到(包含到)第三级。”)不要让我为你写整个项目,你可以尝试自己做。所有这一切都取决于您在一周后回复我的原始(并已接受)答案,说它不符合您的新要求。
  • @Anton Tredder,我还必须指出,我花了很多时间来帮助你,但期望我为你写一个成品是太多了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多