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

Sql server 从SQL Server表生成XML文件所需的所有步骤,sql-server,xml,tsql,xquery-sql,Sql Server,Xml,Tsql,Xquery Sql,我需要以指定的XML格式生成输出,虽然在2021年很容易,但我首先尝试使用服务将其转换为XSD,并将其与我的SQL一起使用(使用创建XML模式集合Schema1作为@Schema1);但是这不起作用,我怀疑使用XSD生成XML没有简单的方法,仍然需要使用选择,如果我错了,请纠正我。我下面的例子不是最终的。我使用的是SQL Server 2017,只有SSMS作为我的工具。(没有.NET可用) 这是我的示例XML <?xml version="1.0" encoding=

我需要以指定的XML格式生成输出,虽然在2021年很容易,但我首先尝试使用服务将其转换为XSD,并将其与我的SQL一起使用(使用
创建XML模式集合Schema1作为@Schema1
);但是这不起作用,我怀疑使用XSD生成XML没有简单的方法,仍然需要使用
选择
,如果我错了,请纠正我。我下面的例子不是最终的。我使用的是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使用两个别名: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');
<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>
输出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'  , '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');
<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>

提问时,您需要提供一个最小的可重复示例。请参考以下链接:请提供以下内容:(1)DDL和示例数据填充,即创建表和插入T-SQL语句。(2) 您需要做什么,即逻辑和代码尝试在T-SQL中实现它。(3) 所需输出,基于上述#1中的样本数据。(4) 您的SQL Server版本(选择@@version;)