TSQL for XML Path maxOccurs

时间:2018-03-09 12:39:52

标签: sql-server xml xsd

我在尝试创建结果时遇到问题,如下所示。

非常感谢任何帮助。

必需的XML输出

<Wartung>
 <Wartungsseite>
  <Wartungsdetails>
   <Vertragsnummer>111111</Vertragsnummer>
   <Kunde>bla1</Kunde>
   <Betrag>123.00</Betrag>
  </Wartungsdetails>
  <Wartungsdetails>
   <Vertragsnummer>222222</Vertragsnummer>
   <Kunde>bla2</Kunde>
   <Betrag>60.00</Betrag>
  </Wartungsdetails>
  <Wartungsdetails>
   <Vertragsnummer>3333333</Vertragsnummer>
   <Kunde>bla3</Kunde>
   <Betrag>14.00</Betrag>
  </Wartungsdetails>
</Wartungsseite>
<Wartungsseite>
  <Wartungsdetails>
   <Vertragsnummer>4444</Vertragsnummer>
   <Kunde>bla4</Kunde>
   <Betrag>123.00</Betrag>
</Wartungsdetails>
  <Wartungsdetails>
   <Vertragsnummer>5555</Vertragsnummer>
   <Kunde>bla5</Kunde>
   <Betrag>60.00</Betrag>
  </Wartungsdetails>
  <Wartungsdetails>
   <Vertragsnummer>66666</Vertragsnummer>
   <Kunde>bla6</Kunde>
   <Betrag>14.00</Betrag>
  </Wartungsdetails>
 </Wartungsseite>
</Wartung>

我的SQL的实际XML输出

 <Wartung>
<Wartungsseite>
 <Wartungsdetails>
  <Vertragsnummer>3333</Vertragsnummer>
  <Kunde>bla3</Kunde>
  <Betrag>123.00</Betrag>
</Wartungsdetails>
<Wartungsdetails>
  <Vertragsnummer>111</Vertragsnummer>
  <Kunde>bla1</Kunde>
  <Betrag>60.00</Betrag>
</Wartungsdetails>
<Wartungsdetails>
  <Vertragsnummer>2222</Vertragsnummer>
  <Kunde>bla2</Kunde>
  <Betrag>14.00</Betrag>
 </Wartungsdetails>
</Wartungsseite>
  </Wartung>

生成此内容的SQL

SELECT
(
    SELECT
        gutschrift.VertragNr                                    AS Vertragsnummer,
        gutschrift.PartnerName1 + ' ' + gutschrift.PartnerName2 AS Kunde,
        gutschrift.NettoBetrag                                  AS Betrag
    FROM
        Transfer.TB_LE148                    AS gutschrift
        LEFT JOIN
            MmvFibu.TB_Rechnungsausgangsbuch AS rbuch
                ON rbuch.FK_KaeuferKontakt = gutschrift.WartHaendler_PK_ID
    WHERE
        rbuch.PK_ID = 1054401
    FOR XML PATH('Wartungsdetails'), ROOT('Wartungsseite'), TYPE
)
 FOR XML PATH('Wartung'), TYPE;

问题 &#34; Wartungsseite&#34;中最大数量的子项目。是否有更多可用于&#34; Wartungsdetails&#34;的项目。然后创建一个新项目&#34; Wartungsseite&#34;。

1 个答案:

答案 0 :(得分:1)

试试这样:

DECLARE @mockTable TABLE(ID INT IDENTITY, SomeValue VARCHAR(100));
INSERT INTO @mockTable VALUES('val1'),('val2'),('val3'),('val4'),('val5'),('val6'),('val7');

WITH GroupOfThree AS
(
    SELECT (ROW_NUMBER() OVER(ORDER BY ID)-1) / 3 AS GroupCode
          ,*
    FROM @mockTable
)
SELECT (
        SELECT ID, SomeValue
        FROM GroupOfThree As innerSource
        WHERE outerSource.GroupCode=innerSource.GroupCode
        ORDER BY innerSource.ID
        FOR XML PATH('Wartungsdetails'),TYPE 
       )
FROM GroupOfThree AS outerSource
GROUP BY outerSource.GroupCode
FOR XML PATH('Wartungsseite'), ROOT ('Wartung');

结果

<Wartung>
  <Wartungsseite>
    <Wartungsdetails>
      <ID>1</ID>
      <SomeValue>val1</SomeValue>
    </Wartungsdetails>
    <Wartungsdetails>
      <ID>2</ID>
      <SomeValue>val2</SomeValue>
    </Wartungsdetails>
    <Wartungsdetails>
      <ID>3</ID>
      <SomeValue>val3</SomeValue>
    </Wartungsdetails>
  </Wartungsseite>
  <Wartungsseite>
    <Wartungsdetails>
      <ID>4</ID>
      <SomeValue>val4</SomeValue>
    </Wartungsdetails>
    <Wartungsdetails>
      <ID>5</ID>
      <SomeValue>val5</SomeValue>
    </Wartungsdetails>
    <Wartungsdetails>
      <ID>6</ID>
      <SomeValue>val6</SomeValue>
    </Wartungsdetails>
  </Wartungsseite>
  <Wartungsseite>
    <Wartungsdetails>
      <ID>7</ID>
      <SomeValue>val7</SomeValue>
    </Wartungsdetails>
  </Wartungsseite>
</Wartung>

诀窍是将ROW_NUMBER()整数除法一起使用(向下舍入到较低的整数)。