从 SQL Server 表生成 XML 文件所需的所有步骤

问题描述

我需要以指定的 XML 格式生成输出,认为 2021 年会很容易,首先尝试使用 online 服务将其转换为 XSD 并与我的 SQL 一起使用(使用 CREATE XML SCHEMA COLLECTION Schema1 AS @Schema1);但这不起作用,我怀疑使用 XSD 生成 XML 没有简单的方法,仍然需要使用您的 SELECT,如果我错了,请纠正我。我下面的例子不是最终的。我正在使用 SQL Server 2017 并且只有 SSMS 作为我的工具。 (没有 .NET 可用)。

这是我的示例 XML。

<?xml version="1.0" encoding="UTF-8"?>
<Users>
    <User Active="0"  gender="Male" DOB="1965-02-12" mi="X" lName="John" fName="Dorx">
        <CInfo ResArea="Montigo"/>
        <Demographic race="Asian" HE="No"/>
        <RA>
            <Memb StartDD="2004-06-11" eStatus="Active" StatusAsOf="2004-05-12" UserID="XHD15"/>
        </RA>
    </User>
    <User Active="0"  gender="Male" DOB="1977-04-14"  mi="X" lName="Mario" fName="Ma">
        <CInfo ResArea="Blanco"/>
        <Demographic race="White" HE="Yes"/>
        <RA>
            <Memb StartDD="2004-02-22" eStatus="Active" StatusAsOf="2004-03-26" UserID="MMX12"/>
            <Memb StartDD="2004-12-22" eStatus="Active" StatusAsOf="2004-05-26" UserID="MMX12"/>
        </RA>
    </User>
</Users>

这是我的测试代码和 SQL(这还不是最终版本,我仍在努力格式化所有标签,我可能需要执行子查询和分组以在同一个 Memb 下列出 2 User ).

/*
SELECT * INTO #t FROM (
SELECT 'XHD15' UserID,'1965-02-12' DOB,'John' lName,'Dorx' fName,'x' mi,'Montigo' ResArea,'2004-06-11' StartDD,'Active' eStatus,'2004-05-12' StatusAsOf,'Asian' race,'No' HE  union
SELECT 'MMX12' UserID,'1977-04-14' DOB,'Mario' lName,'Ma' fName,'Blanco' ResArea,'2004-02-22' StartDD,'2004-03-26' StatusAsOf,'White' race,'2004-12-22' StartDD,'2004-12-26' StatusAsOf,'No' HE  )x  
*/
  SELECT  Lname AS [@Lname],Fname [@Fname],mi [@mi],DOB [@DOB],MAX(ResArea) AS [CInfo/@ResArea],MAX(race) AS [Demographic/@race],MAX(HE) AS [Demographic/@HE],MAX(StartDD) AS [RA/Memb/@StartDD],MAX(eStatus) AS [RA/Memb/@eStatus],MAX(StatusAsOf)  AS [RA/Memb/@StatusAsOf]
       -- Need subquery for multi StartDD
 FROM #t AS [User]    
 GROUP BY Lname,Fname,mi,DOB 
      FOR XML PATH ('User'),ROOT ('Users')--,ELEMENTS 

enter image description here

解决方法

请尝试以下解决方案。

下面的 SQL 使用了两个别名:p(arent) 和 c(hild)。

生成嵌套 XML 时,父子数据集通过 agg_code 子句连接。

SQL

WHERE

输出 XML

-- DDL and sample data population,start
DECLARE @tbl TABLE (
    ID INT IDENTITY PRIMARY KEY,UserID CHAR(5),DOB DATE,lName VARCHAR(20),fName VARCHAR(20),mi VARCHAR(20),ResArea VARCHAR(30),StartDD DATE,eStatus VARCHAR(10),StatusAsOf DATE,race  VARCHAR(20),HE VARCHAR(5)
);
INSERT INTO @tbl VALUES
('XHD15','1965-02-12','John','Dorx','x','Montigo','2004-06-11','Active','2004-05-12','Asian','No'),('MMX12','1977-04-14','Mario','Ma','Blanco','2004-02-22','2004-03-26','White','2004-12-22','2004-12-26','No');
 -- DDL and sample data population,end

SELECT Lname AS [@Lname],Fname [@Fname],mi [@mi],DOB [@DOB],ResArea AS [CInfo/@ResArea],race AS [Demographic/@race],HE AS [Demographic/@HE],(SELECT StartDD AS [@StartDD],eStatus AS [@eStatus],StatusAsOf AS [@StatusAsOf],UserID AS [@UserID]
        FROM @tbl AS c
        WHERE p.UserID = c.UserID
        FOR XML PATH('Memb'),TYPE,ROOT('RA')
    )
FROM @tbl AS p
GROUP BY p.UserID,p.Lname,p.Fname,p.mi,p.DOB,p.ResArea,p.race,p.HE
FOR XML PATH ('User'),ROOT ('Users');

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...