从 MS SQL 生成 XML,结构问题,命名空间前缀:

Produce XML from MS SQL, structure issues, namespace prefix:

我正在尝试 运行 SQL 复杂 XML 出 MS SQL Server 2016。考虑到我是新手,我取得了巨大的进步XML 代,但仍然无法弄清楚如何进行嵌套部分以使 Export/Client 结构变得重要我尝试放入嵌套 ROOT 子句中的内容。不确定这个问题是否也导致我缺少 hmis: 大多数元素的前缀。我需要它们,就像附图中的 Desired output/schema.

同时粘贴自包含测试输入和工作代码,我用 ?????我认为造成这种麻烦的地方。感谢您的提示。您认为使用其他类型 FOR XML 会容易吗?明确的??? 最佳马里奥

SQL 版本:Microsoft SQL Server 2017 (RTM-CU27)

更新:添加了@export table

    /*                     --- test data/table
    DROP TABLE IF EXISTS  #t;
    SELECT * INTO #T FROM (    --    SELECT * FROM #T
    SELECT 111 PersonalID,  'Alpha' first_name, 'Brown' last_name,  '1/1/2000' birth_date, 'Manager Alpha' CaseManager_PH, 0 Female, '3/2/2022' ExportDate,  'AW3' user_updated   UNION
    SELECT 222 PersonalID,  'Bobby' , 'Dow' ,  '2/2/2002', 'Manager2222'  , 0 , '3/3/2022' ExportDate, 'BBX3'  ) A
    SELECT * FROM #T
  
  */
DECLARE @export TABLE (
       ExportDate date , StartDate DATE, EndDate date)
INSERT INTO @export (ExportDate, StartDate, EndDate)
VALUES ('3/22/2022', '1/1/2022', '4/4/2022')
    
    
        
    
;    WITH XMLNAMESPACES ('https://www.hudhdx.info/Resources/Vendors/4_0/HUD_HMIS.xsd' as hmis, 
                'http://www.w3.org/2001/XMLSchema-instance'  AS xsi )
     
    SELECT 
      10         AS [hmis:SourceID],
      111        AS [hmis:Export/ExportID]
 ,CAST(e.ExportDate  AS VARCHAR(10))   AS [hmis:Export/ExportDate]  ---<<< Change
 ,CAST(e.StartDate   AS VARCHAR(10))   AS [hmis:Export/ExportPeriod/StartDate]
 ,CAST(e.EndDate     AS VARCHAR(10))   AS [hmis:Export/ExportPeriod/EndDate]
         , (  
             SELECT 
                  ExportDate AS [hmis:Client/@DateCreated],  ExportDate AS [hmis:Client/@dateUpdated],
                  PersonalID AS [hmis:Client/PersonalID],
                  first_name AS [hmis:Client/first_name], 
                  last_name  AS [hmis:Client/last_name],
                  birth_date AS [hmis:Client/birth_date],
                    CaseManager_PH    AS [hmis:Client/CustomClientElements/CaseManager_PH],
                    'Unknown'         AS [hmis:Client/CustomClientElements/Casemanager_ContactInfo],
                  user_updated   AS [hmis:Client/user_updated]
             FROM #t  t
            -- WHERE 1=1
             FOR XML  path ,  ROOT('Export'), TYPE)  ---????
    FROM @export  e
     FOR XML  PATH('Source'), ROOT('Sources')

需要的输出格式:

 <hmis:Sources xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:hmis="https://www.hudhdx.info/Resources/Vendors/4_0/HUD_HMIS.xsd">
  <hmis:Source>
    <hmis:SourceID>10</hmis:SourceID>
    <hmis:Export>
      <ExportID>111</ExportID>
      <ExportDate>2022-03-22</ExportDate>
      <ExportPeriod>
        <StartDate>2022-01-01</StartDate>
        <EndDate>2022-04-04</EndDate>
      </ExportPeriod>
 
 <hmis:Client DateCreated="3/2/2022" DateUpdated="3/2/2022">
        <hmis:PersonalID>111</hmis:PersonalID>
        <hmis:first_name>Alpha</hmis:first_name>
        <hmis:last_name>Brown</hmis:last_name>
        <hmis:birth_date>1/1/2000</hmis:birth_date>
        <hmis:CustomClientElements>
          <hmis:CaseManager_PH>Manager Alpha</hmis:CaseManager_PH>
          <hmis:Casemanager_ContactInfo>Unknown</hmis:Casemanager_ContactInfo>
        </hmis:CustomClientElements>
        <hmis:user_updated>AW3</hmis:user_updated>
      </hmis:Client>

      <hmis:Client DateCreated="3/3/2022" DateUpdated="3/3/2022">
        <hmis:PersonalID>222</hmis:PersonalID>
        <hmis:first_name>Bobby</hmis:first_name>
        <hmis:last_name>Dow</hmis:last_name>
        <hmis:birth_date>2/2/2002</hmis:birth_date>
        <hmis:CustomClientElements>
          <hmis:CaseManager_PH>Manager2222</hmis:CaseManager_PH>
          <hmis:Casemanager_ContactInfo>Unknown</hmis:Casemanager_ContactInfo>
        </hmis:CustomClientElements>
        <hmis:user_updated>BBX3</hmis:user_updated>
      </hmis:Client>
    </hmis:Export>
  </hmis:Source>
</hmis:Sources>

请尝试以下解决方案。

所需的输出分两步产生:

  1. 原始 XML 通过 FOR XML PATH('r'), TYPE, ROOT('root').
  2. 通过 XQuery .query() 方法和 FLWOR 表达式微调最终 XML。

因为没有提供最小的可重现示例,希望我没有遗漏任何内容。

SQL

-- DDL and sample data population, start
DECLARE @tbl TABLE (
    PersonalID INT PRIMARY KEY,
    first_name VARCHAR(30),
    last_name VARCHAR(30),
    birth_date DATE,
    CaseManager_PH VARCHAR(30),
    Female BIT,
    ExportDate DATE,
    user_updated VARCHAR(30)
    );
INSERT INTO @tbl (
    PersonalID,
    first_name,
    last_name,
    birth_date,
    CaseManager_PH,
    Female,
    ExportDate,
    user_updated
)
VALUES
(111, 'Alpha', 'Brown', '2000-01-01', 'Manager Alpha', 0, '2022-03-02', 'AW3'),
(222, 'Bobby', 'Dow', '2002-02-02', 'Manager2222', 0 , '2022-03-03', 'BBX3');

DECLARE @export TABLE (ExportDate date , StartDate DATE, EndDate date);
INSERT INTO @export (ExportDate, StartDate, EndDate) VALUES 
('2022-03-22', '2022-01-01', '2022-04-04');
-- DDL and sample data population, end

DECLARE @ExportDate date, @StartDate DATE, @EndDate DATE;
SELECT @ExportDate = ExportDate, @StartDate = StartDate, @EndDate = EndDate 
FROM @export;

WITH XMLNAMESPACES ('https://www.hudhdx.info/Resources/Vendors/4_0/HUD_HMIS.xsd' as hmis, 
            'http://www.w3.org/2001/XMLSchema-instance'  AS xsi )
SELECT (
SELECT * FROM @tbl
FOR XML PATH('r'), TYPE, ROOT('root'))
.query('<hmis:Sources xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <hmis:Source>
        <hmis:SourceID>10</hmis:SourceID>
        <hmis:Export>
          <ExportID>111</ExportID>
          <ExportDate>{sql:variable("@ExportDate")}</ExportDate>
          <ExportPeriod>
            <StartDate>{sql:variable("@StartDate")}</StartDate>
            <EndDate>{sql:variable("@EndDate")}</EndDate>
          </ExportPeriod>
          {
          for $x in /root/r
          return <hmis:Client DateCreated="{$x/ExportDate}" DateUpdated="{$x/ExportDate}">
                <hmis:PersonalID>{data($x/PersonalID)}</hmis:PersonalID>
                <hmis:first_name>{data($x/first_name)}</hmis:first_name>
                <hmis:last_name>{data($x/last_name)}</hmis:last_name>
                <hmis:birth_date>{data($x/birth_date)}</hmis:birth_date>
                <hmis:CustomClientElements>
                    <hmis:CaseManager_PH>{data($x/CaseManager_PH)}</hmis:CaseManager_PH>
                    <hmis:Casemanager_ContactInfo>Unknown</hmis:Casemanager_ContactInfo>
                </hmis:CustomClientElements>
                <hmis:user_updated>{data($x/user_updated)}</hmis:user_updated>
          </hmis:Client>
          }
</hmis:Export>
</hmis:Source></hmis:Sources>');

输出

<hmis:Sources xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:hmis="https://www.hudhdx.info/Resources/Vendors/4_0/HUD_HMIS.xsd">
  <hmis:Source>
    <hmis:SourceID>10</hmis:SourceID>
    <hmis:Export>
      <ExportID>111</ExportID>
      <ExportDate>0</ExportDate>
      <ExportPeriod>
        <StartDate>0</StartDate>
        <EndDate>0</EndDate>
      </ExportPeriod>
      <hmis:Client DateCreated="2022-03-02" DateUpdated="2022-03-02">
        <hmis:PersonalID>111</hmis:PersonalID>
        <hmis:first_name>Alpha</hmis:first_name>
        <hmis:last_name>Brown</hmis:last_name>
        <hmis:birth_date>2000-01-01</hmis:birth_date>
        <hmis:CustomClientElements>
          <hmis:CaseManager_PH>Manager Alpha</hmis:CaseManager_PH>
          <hmis:Casemanager_ContactInfo>Unknown</hmis:Casemanager_ContactInfo>
        </hmis:CustomClientElements>
        <hmis:user_updated>AW3</hmis:user_updated>
      </hmis:Client>
      <hmis:Client DateCreated="2022-03-03" DateUpdated="2022-03-03">
        <hmis:PersonalID>222</hmis:PersonalID>
        <hmis:first_name>Bobby</hmis:first_name>
        <hmis:last_name>Dow</hmis:last_name>
        <hmis:birth_date>2000-01-01</hmis:birth_date>
        <hmis:CustomClientElements>
          <hmis:CaseManager_PH>Manager2222</hmis:CaseManager_PH>
          <hmis:Casemanager_ContactInfo>Unknown</hmis:Casemanager_ContactInfo>
        </hmis:CustomClientElements>
        <hmis:user_updated>BBX3</hmis:user_updated>
      </hmis:Client>
    </hmis:Export>
  </hmis:Source>
</hmis:Sources>

您提到了 Explicit,所以这里是用 FOAM 生成的解决方案。对某些人来说不是那么漂亮,但工作正常,虽然在超级花式格式和某些情况下 maxOccurs="0" 可能会有一些限制。它还可能需要一些手动调整。

我单选了tablec只是个人喜好,需要手动添加top 1几个关卡。但也适用于 join

    /*  --------------------TEST DATA
    drop table if exists #tbl
    Create table #tbl  (
        PersonalID INT ,    first_name VARCHAR(30),    last_name VARCHAR(30),    birth_date DATE,    CaseManager_PH VARCHAR(30),    Female BIT,    ExportDate DATE,    user_updated VARCHAR(30)    );
    INSERT INTO #tbl 
    VALUES
    (111, 'Alpha', 'Brown', '2000-01-01', 'Manager Alpha', 0, '2022-03-02', 'AW3'),
    (222, 'Bobby', 'Dow', '2002-02-02', 'Manager2222', 0 , '2022-03-03', 'BBX3');         

    create table #export   (ExportDate date , StartDate DATE, EndDate date);
    INSERT INTO #export (ExportDate, StartDate, EndDate) VALUES 
    ('2022-03-22', '2022-01-01', '2022-04-04');
    --        select * from #export 
    --       select * from #tbl
    --       drop table c
     Select * into c  from (
         select c.*, e.StartDate, e.EndDate
         , hmis =cast('https://www.hudhdx.info/Resources/Vendors/4_0/HUD_HMIS.xsd' as varchar(255)) 
         ,  ExportID  = '111', SourceID  = '10', ContactInfo = 'Unknown'
         from #tbl c
         join #export e on 1=1
     ) c

Select *    from c
*/

/********************************************
* Output produced by Foam @ 
*   3/31/2022 12:12:03 PM
*
* digital nothing design 
* http://www.digitalnothing.com
********************************************/


SELECT Tag = 1, Parent = NULL,
    [hmis:Sources!1!xmlns:hmis] = 'https://www.hudhdx.info/Resources/Vendors/4_0/HUD_HMIS.xsd',
    [hmis:Source!2!] = NULL,
    [hmis:Source!2!hmis:SourceID!element] = NULL,
    [hmis:Export!3!] = NULL,
    [hmis:Export!3!ExportID!element] = NULL,
    [hmis:Export!3!ExportDate!element] = NULL,
    [ExportPeriod!4!] = NULL,
    [ExportPeriod!4!StartDate!element] = NULL,
    [ExportPeriod!4!EndDate!element] = NULL,
    [hmis:Client!5!DateCreated] = NULL,
    [hmis:Client!5!DateUpdated] = NULL,
    [hmis:Client!5!hmis:PersonalID!element] = NULL,
    [hmis:Client!5!hmis:first_name!element] = NULL,
    [hmis:Client!5!hmis:last_name!element] = NULL,
    [hmis:Client!5!hmis:birth_date!element] = NULL,
    [hmis:CustomClientElements!6!] = NULL,
    [hmis:CustomClientElements!6!hmis:Casemanager_PH!element] = NULL,
    [hmis:CustomClientElements!6!hmis:Casemanager_ContactInfo!element] = NULL,
    [hmis:Client!5!hmis:user_updated!element] = NULL

UNION ALL

SELECT top 1     Tag = 2, Parent = 1,
    [hmis:Sources!1!xmlns:hmis] = NULL,
    [hmis:Source!2!] = NULL,
    [hmis:Source!2!hmis:SourceID!element] = c.SourceID,
    [hmis:Export!3!] = NULL,
    [hmis:Export!3!ExportID!element] = NULL,
    [hmis:Export!3!ExportDate!element] = NULL,
    [ExportPeriod!4!] = NULL,
    [ExportPeriod!4!StartDate!element] = NULL,
    [ExportPeriod!4!EndDate!element] = NULL,
    [hmis:Client!5!DateCreated] = NULL,
    [hmis:Client!5!DateUpdated] = NULL,
    [hmis:Client!5!hmis:PersonalID!element] = NULL,
    [hmis:Client!5!hmis:first_name!element] = NULL,
    [hmis:Client!5!hmis:last_name!element] = NULL,
    [hmis:Client!5!hmis:birth_date!element] = NULL,
    [hmis:CustomClientElements!6!] = NULL,
    [hmis:CustomClientElements!6!hmis:Casemanager_PH!element] = NULL,
    [hmis:CustomClientElements!6!hmis:Casemanager_ContactInfo!element] = NULL,
    [hmis:Client!5!hmis:user_updated!element] = NULL
from c 

UNION ALL

SELECT top 1     Tag = 3, Parent = 2,
    [hmis:Sources!1!xmlns:hmis] = NULL,
    [hmis:Source!2!] = NULL,
    [hmis:Source!2!hmis:SourceID!element] = NULL,
    [hmis:Export!3!] = NULL,
    [hmis:Export!3!ExportID!element] = c.ExportID,
    [hmis:Export!3!ExportDate!element] = c.ExportDate,
    [ExportPeriod!4!] = NULL,
    [ExportPeriod!4!StartDate!element] = NULL,
    [ExportPeriod!4!EndDate!element] = NULL,
    [hmis:Client!5!DateCreated] = NULL,
    [hmis:Client!5!DateUpdated] = NULL,
    [hmis:Client!5!hmis:PersonalID!element] = NULL,
    [hmis:Client!5!hmis:first_name!element] = NULL,
    [hmis:Client!5!hmis:last_name!element] = NULL,
    [hmis:Client!5!hmis:birth_date!element] = NULL,
    [hmis:CustomClientElements!6!] = NULL,
    [hmis:CustomClientElements!6!hmis:Casemanager_PH!element] = NULL,
    [hmis:CustomClientElements!6!hmis:Casemanager_ContactInfo!element] = NULL,
    [hmis:Client!5!hmis:user_updated!element] = NULL
from c

UNION ALL

SELECT top 1     Tag = 4, Parent = 3,
    [hmis:Sources!1!xmlns:hmis] = NULL,
    [hmis:Source!2!] = NULL,
    [hmis:Source!2!hmis:SourceID!element] = NULL,
    [hmis:Export!3!] = NULL,
    [hmis:Export!3!ExportID!element] = NULL,
    [hmis:Export!3!ExportDate!element] = NULL,
    [ExportPeriod!4!] = NULL,
    [ExportPeriod!4!StartDate!element] = c.StartDate,
    [ExportPeriod!4!EndDate!element] = c.EndDate,
    [hmis:Client!5!DateCreated] = NULL,
    [hmis:Client!5!DateUpdated] = NULL,
    [hmis:Client!5!hmis:PersonalID!element] = NULL,
    [hmis:Client!5!hmis:first_name!element] = NULL,
    [hmis:Client!5!hmis:last_name!element] = NULL,
    [hmis:Client!5!hmis:birth_date!element] = NULL,
    [hmis:CustomClientElements!6!] = NULL,
    [hmis:CustomClientElements!6!hmis:Casemanager_PH!element] = NULL,
    [hmis:CustomClientElements!6!hmis:Casemanager_ContactInfo!element] = NULL,
    [hmis:Client!5!hmis:user_updated!element] = NULL
from c

UNION ALL

SELECT Tag = 5, Parent = 3,
    [hmis:Sources!1!xmlns:hmis] = NULL,
    [hmis:Source!2!] = NULL,
    [hmis:Source!2!hmis:SourceID!element] = NULL,
    [hmis:Export!3!] = NULL,
    [hmis:Export!3!ExportID!element] = NULL,
    [hmis:Export!3!ExportDate!element] = NULL,
    [ExportPeriod!4!] = NULL,
    [ExportPeriod!4!StartDate!element] = NULL,
    [ExportPeriod!4!EndDate!element] = NULL,
    [hmis:Client!5!DateCreated] = c.ExportDate,
    [hmis:Client!5!DateUpdated] = c.ExportDate,
    [hmis:Client!5!hmis:PersonalID!element] = c.PersonalID,
    [hmis:Client!5!hmis:first_name!element] = c.first_name,
    [hmis:Client!5!hmis:last_name!element] = c.last_name,
    [hmis:Client!5!hmis:birth_date!element] = c.birth_date,
    [hmis:CustomClientElements!6!] = NULL,
    [hmis:CustomClientElements!6!hmis:Casemanager_PH!element] = NULL,
    [hmis:CustomClientElements!6!hmis:Casemanager_ContactInfo!element] = NULL,
    [hmis:Client!5!hmis:user_updated!element] = c.user_updated
from c

UNION ALL

SELECT Tag = 6, Parent = 5,
    [hmis:Sources!1!xmlns:hmis] = NULL,
    [hmis:Source!2!] = NULL,
    [hmis:Source!2!hmis:SourceID!element] = NULL,
    [hmis:Export!3!] = NULL,
    [hmis:Export!3!ExportID!element] = NULL,
    [hmis:Export!3!ExportDate!element] = NULL,
    [ExportPeriod!4!] = NULL,
    [ExportPeriod!4!StartDate!element] = NULL,
    [ExportPeriod!4!EndDate!element] = NULL,
    [hmis:Client!5!DateCreated] = NULL,
    [hmis:Client!5!DateUpdated] = NULL,
    [hmis:Client!5!hmis:PersonalID!element] = c.PersonalID,
    [hmis:Client!5!hmis:first_name!element] = NULL,
    [hmis:Client!5!hmis:last_name!element] = NULL,
    [hmis:Client!5!hmis:birth_date!element] = NULL,
    [hmis:CustomClientElements!6!] = NULL,
    [hmis:CustomClientElements!6!hmis:Casemanager_PH!element] = ISNULL(c.Casemanager_PH,''),
    [hmis:CustomClientElements!6!hmis:Casemanager_ContactInfo!element] = ISNULL(c.ContactInfo,''),
    [hmis:Client!5!hmis:user_updated!element] = NULL
from c

ORDER BY
    [hmis:Client!5!hmis:PersonalID!element] ASC,
    Tag

FOR XML EXPLICIT



--  sample xml with column names as element values  used in FOAM
/*
 <hmis:Sources    xmlns:hmis="https://www.hudhdx.info/Resources/Vendors/4_0/HUD_HMIS.xsd" >
  <hmis:Source>
    <hmis:SourceID>c.SourceID</hmis:SourceID>
    <hmis:Export>
      <ExportID>c.ExportID</ExportID>
      <ExportDate>c.ExportDate</ExportDate>
      <ExportPeriod>
        <StartDate>c.StartDate</StartDate>
        <EndDate>c.EndDate</EndDate>
      </ExportPeriod>
 
       <hmis:Client  DateCreated = "c.ExportDate" DateUpdated="c.ExportDate" >
        <hmis:PersonalID>c.PersonalID</hmis:PersonalID>
        <hmis:first_name>c.first_name</hmis:first_name>
        <hmis:last_name>c.last_name</hmis:last_name>
        <hmis:birth_date>c.birth_date</hmis:birth_date>
        <hmis:CustomClientElements>
          <hmis:Casemanager_PH>c.Casemanager_PH</hmis:Casemanager_PH>
          <hmis:Casemanager_ContactInfo>c.ContactInfo</hmis:Casemanager_ContactInfo>
        </hmis:CustomClientElements>
        <hmis:user_updated>c.user_updated</hmis:user_updated>
      </hmis:Client>
    </hmis:Export>
  </hmis:Source>
</hmis:Sources>
*/