从 SQL 服务器 table 生成 XML 文件所需的所有步骤

All steps required to produce a XML file from a SQL Server table

I need to produce output in specified XML format, thought it would be easy in 2021, tried first to convert it into XSD using online 服务并将其与我的 SQL 一起使用(使用 CREATE XML SCHEMA COLLECTION Schema1 AS @Schema1);但这没有用,我怀疑没有简单的方法来生成 XML 使用 XSD,仍然需要使用你的 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(这还不是最终的,我仍在努力格式化所有标签,我可能需要进行子查询和分组以列出 2 Memb相同 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, 'x' mi, 'Blanco' ResArea,  '2004-02-22' StartDD, 'Active' eStatus, '2004-03-26' StatusAsOf, 'White' race, 'No' HE  union
SELECT 'MMX12' UserID, '1977-04-14' DOB, 'Mario' lName,  'Ma' fName, 'x' mi, 'Blanco' ResArea,  '2004-12-22' StartDD, 'Active' eStatus, '2004-12-26' StatusAsOf, 'White' race, '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 

请尝试以下解决方案。

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

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

SQL

-- 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'  , 'x', 'Blanco' , '2004-02-22', 'Active', '2004-03-26', 'White', 'No'),
('MMX12', '1977-04-14', 'Mario',  'Ma'  , 'x', 'Blanco' , '2004-12-22', 'Active', '2004-12-26', 'White', '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'), TYPE, ROOT ('Users');

输出XML

<Users>
  <User Lname="Mario" Fname="Ma" mi="x" DOB="1977-04-14">
    <CInfo ResArea="Blanco" />
    <Demographic race="White" HE="No" />
    <RA>
      <Memb StartDD="2004-02-22" eStatus="Active" StatusAsOf="2004-03-26" UserID="MMX12" />
      <Memb StartDD="2004-12-22" eStatus="Active" StatusAsOf="2004-12-26" UserID="MMX12" />
    </RA>
  </User>
  <User Lname="John" Fname="Dorx" mi="x" DOB="1965-02-12">
    <CInfo ResArea="Montigo" />
    <Demographic race="Asian" HE="No" />
    <RA>
      <Memb StartDD="2004-06-11" eStatus="Active" StatusAsOf="2004-05-12" UserID="XHD15" />
    </RA>
  </User>
</Users>