代码之家  ›  专栏  ›  技术社区  ›  Ivan-Mark Debono

如何将多个表作为一个XML返回?

  •  8
  • Ivan-Mark Debono  · 技术社区  · 6 年前

    我有以下脚本:

    DECLARE @columns TABLE (
        Caption varchar(50),
        Width int);
    
    INSERT INTO @columns 
    VALUES ('Id', 0), ('Name', 100);
    
    DECLARE @rows TABLE (
        Id int,
        [Name] varchar(50));
    
    INSERT INTO @rows 
    VALUES (1, 'John'), (2, 'Steve');
    
    SELECT *,
        (SELECT *
         FROM @rows
         FOR XML PATH('Row'), ROOT('Rows'), TYPE, ELEMENTS)
    FROM @columns
    FOR XML PATH('Column'), ROOT('Results'), TYPE, ELEMENTS;
    

    我需要返回以下XML:

    <Results>
        <Columns>
            <Column>
                <Caption>Id</Caption>
                <Width>0</Width>
            </Column>
            <Column>
                <Caption>Name</Caption>
                <Width>100</Width>
            </Column>
        </Columns>
        <Rows>
            <Row>
                <Id>1</Id>
                <Name>John</Name>
            </Row>
            <Row>
                <Id>2</Id>
                <Name>Steve</Name>
            </Row>
        </Rows>
    </Results>
    

    我的想法是将XML转换为 DataSet 用2 DataTables (一个用于列,另一个用于行)。我将用这个填充 DataGridView .

    但是,我的问题是,我当前生成的XML格式不正确,与我预期的不一样。

    按照预期生成XML的正确语法是什么?

    2 回复  |  直到 6 年前
        1
  •  7
  •   Larnu    6 年前

    这会让你得到你想要的结果, 基于 根据我们的数据:

    SELECT (SELECT Caption,
                   Width
            FROM @columns
            FOR XML PATH('Column'),TYPE) AS [Columns],
           (SELECT Id,
                   [Name]
            FROM @rows
            FOR XML PATH('Row'),TYPE) AS [Rows]
    FOR XML PATH ('Results');
    
        2
  •  2
  •   Saman Gholami    6 年前

    此查询正好生成预期的结果:

    SELECT (SELECT clm.Caption,
                   clm.Width
            FROM @columns clm
            FOR XML PATH('Column'), TYPE) AS Columns,
           (SELECT rs.Id,
                   rs.[Name]
            FROM @rows rs
            FOR XML PATH('Row'),TYPE) AS [Rows]
    FOR XML PATH ('Results');