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

时间:2019-01-24 09:07:31

标签: c# sql sql-server sql-server-2016

我有以下脚本:

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转换为带有2个DataSet的{​​{1}}(一个用于列,另一个用于行)。我将使用它来填充DataTables

但是,我的问题是我当前生成的XML格式不正确,并且与我期望的不同。

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

2 个答案:

答案 0 :(得分:7)

根据我们拥有的数据 ,您将获得想要的结果:

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');

答案 1 :(得分:2)

此查询完全生成您期望的结果:

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');