XML 输出 SQL 需要帮助

XML output in SQL help needed

您好,我在 SQL 中有以下代码,它在 2 个表之间输出 xml。输出是 90% 正确的,但如果可能添加到输出,然后也删除一些输出文本。

我不确定 SQL 是否能够对输出中的元素类型进行编码。请查看下面的代码和输出。目前,如果可能的话,我想对当前输出进行 2 处更改。更改在端口末尾列出



DECLARE @ID_Rechnung int = 1978,
    @XMLData xml;

WITH XMLNAMESPACES ('?xml version="1.0" encoding="UTF-8"?' as ext)

SELECT
    @XMLData = xmldat.xmldataCol 
FROM
(
SELECT (
       SELECT
            -- HIER XML Daten generieren
            [InvoiceHeader].[InvoiceDate]            AS 'invoice-date',
            ([InvoiceHeader].[InvoiceNumber])                           AS 'invoice-number',
       cast(replace([InvoiceHeader].[GrossValue],' ','') as decimal(18,2))                           AS 'gross-total',
        cast(replace([InvoiceHeader].[NetValue],' ','') as decimal(18,2))                           AS 'amount-due',
        [InvoiceHeader].[VatRate]                           AS 'tax-rate',
        cast(replace([InvoiceHeader].[VatValue],' ','') as decimal(18,2))                           AS 'tax-amount',
        [ImagePath] AS 'image-scan-url',
        [InvoiceType] AS 'document-type',
        [LegalEntityVATNo] AS  'account-type/id',
        [LegalEntityName] AS  'account-type/name',
        [SupplierCode] as 'supplier/number',
        [Currency] as 'currency/code',   

    (
        SELECT rtrim([InvoiceLines].[LineNumber]) AS [order-line-num]
            , [PONumber] as [po-number],
            CAST([InvoiceLines].[UnitPrice] AS decimal(18,2)) AS Price ,
            [Quantity] as quantity,
            [TaxAmount] as [tax-amount],
            [LineTotal] as [total],
            [Decsription] as description


        FROM [InvoiceLines] WHERE [InvoiceLines].[DOCID] = @id_Rechnung
        FOR XML PATH('Invoice-line'), ROOT('invoice-lines'), TYPE
    )
FROM [InvoiceHeader] 
WHERE [InvoiceHeader].[DOCID]  = @ID_Rechnung
FOR XML PATH(''), TYPE, ROOT('invoice-header')

) AS xmldataCol
) AS xmldat;

SELECT  @XMLData
.query('<invoice-header>




{
   for $x in /invoice-header/*[local-name()!="root"]
   return $x,
     for $x in /invoice-header/root/r
     return <invoice-lines>/<invoice-line>{$x/*}</invoice-line></invoice-lines>
}
</invoice-header>');

输出:

<invoice-header>
  <invoice-date>20180509</invoice-date>
  <invoice-number>1075440</invoice-number>
  <gross-total>1376.67</gross-total>
  <amount-due>1197.10</amount-due>
  <tax-rate>15.00%</tax-rate>
  <tax-amount>179.57</tax-amount>
  <image-scan-url>\INTEL-SQL01\Attachment18-06-20e0dd165-81d6-445a-95d1-8aac686d44ed\f9a1179c-2a54-480e-b97a-ce6ac7327ae0.000</image-scan-url>
  <account-type>
    <id>4010112052</id>
    <name>CONSOLIDATEDPOWERPROJECTS</name>
  </account-type>
  <supplier>
    <number>12345</number>
  </supplier>
  <currency>
    <code>ZAR</code>
  </currency>
  <invoice-lines xmlns:ext="?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?">
    <Invoice-line>
      <order-line-num>4</order-line-num>
      <po-number>120934861</po-number>
      <Price>50.00</Price>
      <quantity>1.000000</quantity>
      <tax-amount>7.500000</tax-amount>
      <total>50.00</total>
      <description>Test1</description>
    </Invoice-line>
    <Invoice-line>
      <order-line-num>2</order-line-num>
      <po-number>120934861</po-number>
      <Price>10.00</Price>
      <quantity>2.000000</quantity>
      <tax-amount>4.500000</tax-amount>
      <total>20.00</total>
      <description>Test2</description>
    </Invoice-line>
  </invoice-lines>
</invoice-header>

1.How 是否删除行中的以下 xmlns:ext="?xml version=&quot;1.0&quot; encoding=&quot;UTF-8& "<invoice-lines xmlns:ext="?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?">"

  1. 我将如何编码 "<tax-amount>7.500000</tax-amount> 以获得输出":"<tax-amount type="decimal">7.500000</tax-amount>"

如果没有最小的可重现示例,就不可能为您提供完整的工作答案。

(1) 正如@JeroenMostert 已经指出的那样,

'?xml version="1.0" encoding="UTF-8"?'

是一个 XML prolog 声明。只需删除以下行:

WITH XMLNAMESPACES ('?xml version="1.0" encoding="UTF-8"?' as ext)

(2) 下面是一个概念性示例,说明如何向 XML 元素添加属性。这里重要的是添加的顺序,即属性应该在第一位,元素本身是第二位。

SQL

DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, [tax-amount] VARCHAR(20));
INSERT INTO @tbl ([tax-amount]) VALUES
(N'7.500000'),
(N'18.000000');

SELECT 
    'decimal' AS [tax-amount/@type]
    , [tax-amount]
FROM @tbl
FOR XML PATH('r'), TYPE, ROOT('root');

输出

<root>
  <r>
    <tax-amount type="decimal">7.500000</tax-amount>
  </r>
  <r>
    <tax-amount type="decimal">18.000000</tax-amount>
  </r>
</root>