我在尝试创建结果时遇到问题,如下所示。
非常感谢任何帮助。
必需的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;。
答案 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()
与整数除法一起使用(向下舍入到较低的整数)。