首页 > 解决方案 > 使用 FOR XML [SQL] 更改 Xml 的格式

问题描述

我在尝试在 SSMS 中生成 XML 实例时遇到问题,我使用 3 个视图生成 xml 文件,这是我编写的代码:

    DECLARE @xmlDoc xml  
SET @xmlDoc = (
        SELECT *
        FROM   db.View1 AS v1
        INNER JOIN  db.View2 AS v2  ON v2.link = v1.link
        INNER JOIN db.View3 AS v3 ON v3.link = v1.link
        FOR XML AUTO)  
SELECT @xmlDoc

我得到的是这种格式:

<v1 field="data" ...>
    <v2 field="data" ...>
        <v3 field="data" .../>
    </v2>
</v1>

但我需要将 v2 和 v3 置于同一层级,如下所示:

<v1 field="data" ...>
    <v2 field="data" .../>
    <v3 field="data" .../>
</v1>

如果有人有任何想法,它将对我有很大帮助!谢谢 !

标签: sql-serverxmltsql

解决方案


在我们等待您的 (1) DDL 期间...

请尝试以下作为概念示例。

当您有来自不同表的嵌套 XML 时,您需要通过WHERE子句连接它们。它模拟一个相关的子查询。

SQL

-- DDL and sample data population, start
DECLARE @tbl1 TABLE (ID INT PRIMARY KEY, [state] VARCHAR(20));
DECLARE @tbl2 TABLE (ID INT PRIMARY KEY, ParentID INT, [city] VARCHAR(20));
DECLARE @tbl3 TABLE (ID INT PRIMARY KEY, ParentID INT, [population] INT);

INSERT INTO @tbl1 (ID, state) 
VALUES ( 1, 'Florida');
INSERT INTO @tbl2 (ID, ParentID, city)
VALUES (10, 1, 'Miami'); 
INSERT INTO @tbl3 (ID, ParentID, population)
VALUES (5, 1, 470914);
-- DDL and sample data population, end

SELECT v1.state AS [field]
, (SELECT v2.city  AS [field]
    FROM @tbl2 AS v2
    WHERE v2.ParentID = v1.ID
    FOR XML AUTO, TYPE
    )
, (SELECT v3.population AS [field]
    FROM @tbl3 AS v3
    WHERE v3.ParentID = v1.ID
    FOR XML AUTO, TYPE
    )
FROM @tbl1 AS v1
FOR XML AUTO, TYPE;

输出

<v1 field="Florida">
  <v2 field="Miami" />
  <v3 field="470914" />
</v1>

推荐阅读