【问题标题】:SQL code to generate XML [closed]生成 XML 的 SQL 代码 [关闭]
【发布时间】:2016-10-29 08:43:43
【问题描述】:

我是用 SQL 编写 XML 的新手,迫切需要一些帮助来编写用于以下 xml 输出的 SQL。我相信你们中的一个人会发现它真的很容易!非常感谢任何帮助!

<?xml version="1.0"?>
<PaymentList>
<Payment>
<PaymentTypeField>BACS_Payment</PaymentTypeField>
<DebitSortCodeField>300009</DebitSortCodeField>
<DebitAccountNumberField>01163208</DebitAccountNumberField>
<PaymentCurrencyField>GBP</PaymentCurrencyField>
<ValueDateField>17-JUN-2016</ValueDateField>
<DebitAccountNameField>TEST LTD</DebitAccountNameField>
<BeneficiaryList>
<BeneficiaryItem PaymentReferenceNumber="BACS170616" Name="RT & BS LANE"Amount="5443.64" SortCode="202400" AccountNumber="30305146"/>
<BeneficiaryItem PaymentReferenceNumber="BACS170616" Name="CANNON HYGIENE LTD" Amount="197.14" SortCode="400250" AccountNumber="81001884"/>
<BeneficiaryItem PaymentReferenceNumber="BACS170616" Name="COMPLETE OFFICE SO" Amount="102.00" SortCode="406135" AccountNumber="03006513”/>
</BeneficiaryList>
</Payment>
</PaymentList>

谢谢 保罗..

【问题讨论】:

  • 从什么开始?数据源是什么?
  • 哪个 RDBMS(供应商和版本?)
  • 对不起!如果有帮助,这在 Microsoft SQL Server 2014 上?
  • 寻求帮助的问题必须包括期望的行为特定问题或错误以及重现所需的最短代码在问题本身。没有明确的问题陈述的问题对其他读者没有用处。请参阅:How to create a Minimal, Complete, and Verifiable example

标签: sql sql-server xml tsql sql-server-2014


【解决方案1】:

除了您的 XML 存在一些缺陷(日期格式和 &amp; 作为“RT & BS LANE”中未转义的字符以及您没有显示数据来源的事实之外,这将是一个查询完全返回您的示例:

SELECT 'BACS_Payment' AS PaymentTypeField
      ,30009 AS DebitSortCodeField
      ,'01163208' AS DebitAccountNumberField
      ,'GBP' AS PaymentCurrencyField
      ,'2016-06-17' AS ValueDateField --ATTENTION: Avoid culture specific formats!!!
      ,'TEST LTD' AS DebitAccountNameField
      ,(
        SELECT *
        FROM
        (
         SELECT 
                'BACS170616' AS [@PaymentReferenceNumber]
               ,'RT & BS LANE' AS [@Name]
               ,5443.64 AS [@Amount]
               ,'202400' AS [@SortCode]
               ,'30305146' AS [@AccountNumber]

         UNION ALL SELECT 'BACS170616','CANNON HYGIENE LTD',197.14,'400250','81001884'
         UNION ALL SELECT 'BACS170616','COMPLETE OFFICE SO',102.00,'406135','03006513'

        ) AS subselect
        FOR XML PATH('BeneficiaryItem'),ROOT('BeneficiaryList'),TYPE
       )
FOR XML PATH('Paymnent'),ROOT('PaymentList');

注意

中间的 UNION ALL 只是 1:n 相关数据表的 模型,它可能是您的 BeneficiaryItems 列表的来源。您在那里放置一个带有适当WHERE 子句的简单选择,以读取与外部查询相关的数据。其余的应该非常接近您的需求...

这是结果

<PaymentList>
  <Paymnent>
    <PaymentTypeField>BACS_Payment</PaymentTypeField>
    <DebitSortCodeField>30009</DebitSortCodeField>
    <DebitAccountNumberField>01163208</DebitAccountNumberField>
    <PaymentCurrencyField>GBP</PaymentCurrencyField>
    <ValueDateField>2016-06-17</ValueDateField>
    <DebitAccountNameField>TEST LTD</DebitAccountNameField>
    <BeneficiaryList>
      <BeneficiaryItem PaymentReferenceNumber="BACS170616" Name="RT &amp; BS LANE" Amount="5443.64" SortCode="202400" AccountNumber="30305146" />
      <BeneficiaryItem PaymentReferenceNumber="BACS170616" Name="CANNON HYGIENE LTD" Amount="197.14" SortCode="400250" AccountNumber="81001884" />
      <BeneficiaryItem PaymentReferenceNumber="BACS170616" Name="COMPLETE OFFICE SO" Amount="102.00" SortCode="406135" AccountNumber="03006513" />
    </BeneficiaryList>
  </Paymnent>
</PaymentList>

【讨论】:

  • 太棒了,它完全显示了我想要的样子!又一个愚蠢的问题,当我在 sql 中运行代码并单击它显示的结果如上时,如果我尝试在 Web 中打开 xml,我会得到不同的格式?用户应该用什么打开 xml 才能看到相同的结果?
  • 这取决于您的需要...您可以使用类似SELECT CAST((SELECT CAST(@xml AS NVARCHAR(MAX)) FOR XML PATH('')) AS NVARCHAR(MAX)) 的查询来按原样获取 XML,但您会错过缩进... 创建 XML是一回事,显示是完全不同的一回事。因此,如果此问题已解决,请勾选验收并开始一个新问题。作为一个积极的副作用,一个新问题将引起更多关注!
  • 为了在网页上显示,我实际上会寻找 XSLT 方法...使用 XSLT,您可以创建缩进输出。
  • @PaulTippet 非常感谢您说太棒了,但如果您在验收检查中打勾会更好。这很好地关闭了已解决的问题,它将为您和我的帐户支付一些声誉积分。接受和投票是在 SO,THX 上表达谢谢的方式
猜你喜欢
  • 2012-11-27
  • 2011-01-15
  • 2011-08-02
  • 2010-11-21
  • 2011-03-24
  • 2010-09-22
  • 2011-08-04
  • 1970-01-01
  • 2012-03-27
相关资源
最近更新 更多