【问题标题】:Generate SQL query results in specific XML format生成特定 XML 格式的 SQL 查询结果
【发布时间】:2020-09-21 11:43:50
【问题描述】:

我希望生成以下示例格式的 XML 输出:

<?xml version="1.0" encoding="utf-8"?>
<PSD006-ShortTermLoans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:fsa-gov-uk:MER:PSD006:1 PSD006-Schema.xsd" xmlns="urn:fsa-gov-uk:MER:PSD006:1">
<PSDFeedHeader>
  <Submitter>
   <SubmittingFirm>713984</SubmittingFirm>
  </Submitter>
  <ReportDetails>
   <ReportCreationDate>2020-04-23</ReportCreationDate>
   <ReportIdentifier>PSD006_713984__50</ReportIdentifier>
  </ReportDetails>
</PSDFeedHeader>
<PSD006FeedMsg>
  <CoreItems>
   <FirmReferenceNumber>713984</FirmReferenceNumber>
   <TransRef>713984_D000147827</TransRef>
   <Cancellation>false</Cancellation>
  </CoreItems>
  <ShortTermLoans>
   <TransactionDate>2020-03-21</TransactionDate>
   <LoanAmount>1000</LoanAmount>
   <LoanType>HCST</LoanType>
   <APR>399.41</APR>
   <ArrangementFee>0</ArrangementFee>
   <TotalAmountPayable>1834</TotalAmountPayable>
   <Rollover>N</Rollover>
   <OrderOfRollover>0</OrderOfRollover>
   <LengthOfTerm>272</LengthOfTerm>
   <ReasonForLoan>P</ReasonForLoan>
   <DOBOfBorrower>1979-10-07</DOBOfBorrower>
   <PostCode>N14 6HE</PostCode>
   <MonthlyIncomeOfBorrower>3166</MonthlyIncomeOfBorrower>
   <MaritalStatusOfBorrower>O</MaritalStatusOfBorrower>
   <ResidentialStatusOfBorrower>X</ResidentialStatusOfBorrower>
   <EmploymentStatusOfBorrower>EF</EmploymentStatusOfBorrower>
  </ShortTermLoans>
</PSD006FeedMsg>
</PSD006-ShortTermLoans>

这是上述 XML 格式所需的示例数据。

    CREATE TABLE #Loans ( [Transref] varchar(16), [TransactionDate] date, [OriginalAdvance] money, [LoanType] varchar(4), [ContractualAPR] float(8), [OriginalProjectedTotalRepayable] money, [OriginalTerm] int, [ReasonforLoan] varchar(4), [DOB] date, [Postcode] varchar(8), [Salary] int, [SalaryFrequency] int, [ResidentialStatus] int, [EmploymentStatus] int )
INSERT INTO #Loans
VALUES
( '11', N'2020-06-22T00:00:00', 300.0000, 'HCST', 790, 1000.0000, 6, 'HCST', N'1999-01-31T00:00:00', 'HG2 9DX', 20000, 1508, 1486, 470 ), 
( '12', N'2020-06-22T00:00:00', 1000.0000, 'HCST', 99.9, 1000.0000, 12, 'HCST', N'1999-01-31T00:00:00', 'HG2 9DX', 20000, 1508, 1486, 470 ), 
( '13', N'2020-06-22T00:00:00', 1000.0000, 'HCST', 99.9, 1000.0000, 12, 'HCST', N'1999-01-31T00:00:00', 'HG2 9DX', 20000, 1508, 1486, 470 ), 
( '14', N'2020-06-22T00:00:00', 1000.0000, 'HCST', 99.9, 1000.0000, 12, 'HCST', N'1999-01-31T00:00:00', 'HG2 9DX', 20000, 1508, 1486, 470 ), 
( '17', N'2020-08-15T00:00:00', 750.0000, 'HCST', 392.71, 1000.0000, 9, 'HCST', N'1995-01-01T00:00:00', 'SE21 8NZ', 15000, 1508, 1472, 449 ), 
( '17', N'2020-08-15T00:00:00', 750.0000, 'HCST', 392.71, 1000.0000, 9, 'HCST', N'1995-01-01T00:00:00', 'SE21 8NZ', 15000, 1508, 1472, 449 ), 
( '20', N'2020-07-30T00:00:00', 800.0000, 'HCST', 399.4, 1000.0000, 9, 'HCST', N'1985-03-12T00:00:00', 'EH21 6UH', 21000, 1499, 1477, 500 ), 
( NULL, N'2020-08-05T00:00:00', 1000.0000, 'HCST', 790, 1000.0000, 12, 'HCST', N'1980-07-07T00:00:00', 'BD1 3LY', 2000, 1508, 1481, 470 ), 
( '37', N'2020-08-22T00:00:00', 300.0000, 'HCST', 792.4, 1000.0000, 6, 'HCST', N'1999-01-31T00:00:00', 'HG2 9DX', 35000, 1508, NULL, 470 ), 
( '38', N'2020-08-19T00:00:00', 1000.0000, 'HCST', 790, 1000.0000, 12, 'HCST', N'1990-07-07T00:00:00', 'BD1 3LY', 2000, 1508, 1481, 470 )

这是我目前的查询:

     SELECT 

        (

           SELECT '99999' AS Submitter

           FOR XML PATH('SubmittingFirm'), ROOT ('PSDFeedHeader'), TYPE

       ),
       (
           SELECT CONVERT(VARCHAR(10), GETDATE(), 103) AS ReportCreationDate,
           'PSD006_713984__51' AS ReportIdentifier
                  
           FOR XML PATH('ReportDetails'),  ROOT ('PSDFeedHeader'), TYPE
       ),


       
       (
           SELECT TOP 1 * FROM #Loans FOR XML PATH('ShortTermLoans'), TYPE
       )

FOR XML RAW(''), ROOT('PSD006-ShortTermLoans'), ELEMENTS XSINIL;

这给出了下面的 XML,你可以看到我已经取得了一些进展,但是我在嵌套选择时遇到了困难。例如,Submitter 和 ReportDetails 节点应该嵌套在 PSDFeedHeader 节点中。

       <PSD006-ShortTermLoans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <PSDFeedHeader>
    <SubmittingFirm>
      <Submitter>99999</Submitter>
    </SubmittingFirm>
  </PSDFeedHeader>
  <PSDFeedHeader>
    <ReportDetails>
      <ReportCreationDate>24/09/2020</ReportCreationDate>
      <ReportIdentifier>PSD006_713984__51</ReportIdentifier>
    </ReportDetails>
  </PSDFeedHeader>
  <ShortTermLoans>
    <Transref>11</Transref>
    <TransactionDate>2020-06-22</TransactionDate>
    <OriginalAdvance>300.0000</OriginalAdvance>
    <LoanType>HCST</LoanType>
    <ContractualAPR>7.9000000e+002</ContractualAPR>
    <OriginalProjectedTotalRepayable>1000.0000</OriginalProjectedTotalRepayable>
    <OriginalTerm>6</OriginalTerm>
    <ReasonforLoan>HCST</ReasonforLoan>
    <DOB>1999-01-31</DOB>
    <Postcode>HG2 9DX</Postcode>
    <Salary>20000</Salary>
    <SalaryFrequency>1508</SalaryFrequency>
    <ResidentialStatus>1486</ResidentialStatus>
    <EmploymentStatus>470</EmploymentStatus>
  </ShortTermLoans>
</PSD006-ShortTermLoans>

【问题讨论】:

  • 不清楚你得到的两个&lt;Transref&gt; 元素如何适合所需的输出。请澄清。
  • 我们正在向 FCA 提供贷款编号列表和相关详细信息。 Transref 是贷款编号,根据他们的 XML 示例,每个 Transref 都有一个 节点以及在 节点下的相关贷款元素。
  • 在提出问题时,您需要提供一个可重现的最小示例。请参考以下链接:stackoverflow.com/help/minimal-reproducible-example 请提供以下内容: (1) DDL 和样本数据填充,即 CREATE table(s) 加上 INSERT T-SQL 语句。 (2) 你需要做什么,即逻辑和你的代码尝试实现它。 (3) 期望的输出,基于上面#1 中的样本数据。 (4) 你的 SQL Server 版本 (SELECT @@version;)
  • 请使用单个模拟表来模拟上述(1)的所有连接
  • @YitzhakKhabinsky 到目前为止,我已经用示例数据和我的工作更新了这个问题。谢谢

标签: sql-server xml tsql xquery


【解决方案1】:

这是一种通过 XQuery 和 FLWOR 表达式构造所需 XML 的方法。

如果需要,您可以对 XML 中的其他硬编码值应用使用 SQL 变量的相同方法。

SQL

-- DDL and sample data population, start
DECLARE @loans TABLE ( [Transref] varchar(16), [TransactionDate] date, [OriginalAdvance] money, [LoanType] varchar(4), [ContractualAPR] float(8), [OriginalProjectedTotalRepayable] money, [OriginalTerm] int, [ReasonforLoan] varchar(4), [DOB] date, [Postcode] varchar(8), [Salary] int, [SalaryFrequency] int, [ResidentialStatus] int, [EmploymentStatus] int )
INSERT INTO @Loans
VALUES
( '11', N'2020-06-22T00:00:00', 300.0000, 'HCST', 790, 1000.0000, 6, 'HCST', N'1999-01-31T00:00:00', 'HG2 9DX', 20000, 1508, 1486, 470 ), 
( '12', N'2020-06-22T00:00:00', 1000.0000, 'HCST', 99.9, 1000.0000, 12, 'HCST', N'1999-01-31T00:00:00', 'HG2 9DX', 20000, 1508, 1486, 470 ), 
( '13', N'2020-06-22T00:00:00', 1000.0000, 'HCST', 99.9, 1000.0000, 12, 'HCST', N'1999-01-31T00:00:00', 'HG2 9DX', 20000, 1508, 1486, 470 ), 
( '14', N'2020-06-22T00:00:00', 1000.0000, 'HCST', 99.9, 1000.0000, 12, 'HCST', N'1999-01-31T00:00:00', 'HG2 9DX', 20000, 1508, 1486, 470 ), 
( '17', N'2020-08-15T00:00:00', 750.0000, 'HCST', 392.71, 1000.0000, 9, 'HCST', N'1995-01-01T00:00:00', 'SE21 8NZ', 15000, 1508, 1472, 449 ), 
( '17', N'2020-08-15T00:00:00', 750.0000, 'HCST', 392.71, 1000.0000, 9, 'HCST', N'1995-01-01T00:00:00', 'SE21 8NZ', 15000, 1508, 1472, 449 ), 
( '20', N'2020-07-30T00:00:00', 800.0000, 'HCST', 399.4, 1000.0000, 9, 'HCST', N'1985-03-12T00:00:00', 'EH21 6UH', 21000, 1499, 1477, 500 ), 
( NULL, N'2020-08-05T00:00:00', 1000.0000, 'HCST', 790, 1000.0000, 12, 'HCST', N'1980-07-07T00:00:00', 'BD1 3LY', 2000, 1508, 1481, 470 ), 
( '37', N'2020-08-22T00:00:00', 300.0000, 'HCST', 792.4, 1000.0000, 6, 'HCST', N'1999-01-31T00:00:00', 'HG2 9DX', 35000, 1508, NULL, 470 ), 
( '38', N'2020-08-19T00:00:00', 1000.0000, 'HCST', 790, 1000.0000, 12, 'HCST', N'1990-07-07T00:00:00', 'BD1 3LY', 2000, 1508, 1481, 470 );
-- DDL and sample data population, end

DECLARE @SubmittingFirm VARCHAR(20) = '713984'
    , @ReportCreationDate DATE = GETDATE()
    , @Cancellation VARCHAR(10) = 'false';

;WITH XMLNAMESPACES ('http://www.w3.org/2001/XMLSchema-instance' AS [xsi]
    , DEFAULT 'urn:fsa-gov-uk:MER:PSD006:1')
SELECT (
SELECT TOP(1) * FROM @loans
FOR XML PATH('r'), TYPE, ROOT('root')
).query('<PSD006-ShortTermLoans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                       xsi:schemaLocation="urn:fsa-gov-uk:MER:PSD006:1 PSD006-Schema.xsd"
                       xmlns="urn:fsa-gov-uk:MER:PSD006:1">
<PSDFeedHeader>
    <Submitter>
        <SubmittingFirm>{sql:variable("@SubmittingFirm")}</SubmittingFirm>
    </Submitter>
    <ReportDetails>
        <ReportCreationDate>{sql:variable("@ReportCreationDate")}</ReportCreationDate>
        <ReportIdentifier>PSD006_713984__50</ReportIdentifier>
    </ReportDetails>
</PSDFeedHeader>
<PSD006FeedMsg>
    <CoreItems>
        <FirmReferenceNumber>{sql:variable("@SubmittingFirm")}</FirmReferenceNumber>
        <TransRef>713984_D000147827</TransRef>
        <Cancellation>{sql:variable("@Cancellation")}</Cancellation>
    </CoreItems>
{
    for $x in /root/r
    return <ShortTermLoans>{$x/*}</ShortTermLoans>
}
</PSD006FeedMsg>
</PSD006-ShortTermLoans>');

输出

<PSD006-ShortTermLoans xmlns="urn:fsa-gov-uk:MER:PSD006:1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:fsa-gov-uk:MER:PSD006:1 PSD006-Schema.xsd">
  <PSDFeedHeader>
    <Submitter>
      <SubmittingFirm>713984</SubmittingFirm>
    </Submitter>
    <ReportDetails>
      <ReportCreationDate>2020-09-24</ReportCreationDate>
      <ReportIdentifier>PSD006_713984__50</ReportIdentifier>
    </ReportDetails>
  </PSDFeedHeader>
  <PSD006FeedMsg>
    <CoreItems>
      <FirmReferenceNumber>713984</FirmReferenceNumber>
      <TransRef>713984_D000147827</TransRef>
      <Cancellation>false</Cancellation>
    </CoreItems>
    <ShortTermLoans>
      <Transref>11</Transref>
      <TransactionDate>2020-06-22</TransactionDate>
      <OriginalAdvance>300.0000</OriginalAdvance>
      <LoanType>HCST</LoanType>
      <ContractualAPR>7.9000000e+002</ContractualAPR>
      <OriginalProjectedTotalRepayable>1000.0000</OriginalProjectedTotalRepayable>
      <OriginalTerm>6</OriginalTerm>
      <ReasonforLoan>HCST</ReasonforLoan>
      <DOB>1999-01-31</DOB>
      <Postcode>HG2 9DX</Postcode>
      <Salary>20000</Salary>
      <SalaryFrequency>1508</SalaryFrequency>
      <ResidentialStatus>1486</ResidentialStatus>
      <EmploymentStatus>470</EmploymentStatus>
    </ShortTermLoans>
  </PSD006FeedMsg>
</PSD006-ShortTermLoans>

【讨论】:

  • 这简直太棒了,正是我想要的。 @YitzhakKhabinsky
  • @TheCoxta,很高兴听到建议的解决方案对您有用。请不要忘记将其标记为答案。
  • 嗨@YitzhakKhabinsky - 我希望对我的原始请求进行轻微更改。我应该创建一个新帖子还是更新这个帖子?正确的流程是什么? ——
  • @TheCoxta,你需要问一个新问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多