问题描述
我需要以指定的 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
解决方法
请尝试以下解决方案。
下面的 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');