If you want full control over your XML output, then you could go with the explicit and element options. It is a lot of work, but you can define every tag and value.
How EXPLICIT and ELEMENT work
Sample data
create table MyCustomers
(
CustomerId int,
Name nvarchar(10)
);
insert into MyCustomers (CustomerId, Name) values
(1, 'Alfred'),
(2, 'Batman');
create table MyInvoices
(
CustomerId int,
OrderId int,
Amount money
);
insert into MyInvoices (CustomerId, OrderId, Amount) values
(1, 101, 12.34),
(1, 102, 56.78),
(2, 201, 90.12);
Solution
This quickly gets very long, even for this simple example.
-- customer 1 invoice XML
declare @CustomerId int = 1;
--root
select 1 as Tag,
0 as Parent,
null as [Root!1],
null as [Header!2],
null as [Customer!3!Id],
null as [Customer!3!Name!ELEMENT],
null as [Customer!3!InvoiceCount!ELEMENT],
null as [Invoices!4],
null as [Invoice!5!OrderId!ELEMENT],
null as [Invoice!5!Amount!ELEMENT]
union all
--root/header
select 2,
1,
null,
null,
null,
null,
null,
null,
null,
null
union all
--root/header/customer
select 3,
2,
null,
null,
mc.CustomerId,
mc.Name,
count(1) as InvoiceCount,
null,
null,
null
from MyCustomers mc
left join MyInvoices mi
on mi.CustomerId = mc.CustomerId
where mc.CustomerId = @CustomerId
group by mc.CustomerId, mc.Name
union all
--root/invoices
select 4,
1,
null,
null,
null,
null,
null,
null,
null,
null
union all
--root/invoices/invoice
select 5,
4,
null,
null,
mi.CustomerId,
null,
null,
null,
mi.OrderId,
mi.Amount
from MyInvoices mi
where mi.CustomerId = @CustomerId
for xml explicit;
Result
<Root><Header><Customer Id="1"><Name>Alfred</Name><InvoiceCount>2</InvoiceCount></Customer></Header><Invoices><Invoice><OrderId>101</OrderId><Amount>12.3400</Amount></Invoice><Invoice><OrderId>102</OrderId><Amount>56.7800</Amount></Invoice></Invoices></Root>
Or with some formatting
<Root>
<Header>
<Customer Id="1">
<Name>Alfred</Name>
<InvoiceCount>2</InvoiceCount>
</Customer>
</Header>
<Invoices>
<Invoice>
<OrderId>101</OrderId>
<Amount>12.3400</Amount>
</Invoice>
<Invoice>
<OrderId>102</OrderId>
<Amount>56.7800</Amount>
</Invoice>
</Invoices>
</Root>
See it in action: fiddle.
Building the expected result
Solution
This solution example reproduces most of your expected output. I used all constant values to keep this simple. There are additional comments to hightlight the structure.
--root
select 1 as Tag, -- 1 = root
0 as Parent,
null as [Root!1], -- 1
null as [Header!2!MessageId!ELEMENT],
null as [Header!2!TotalNumberOfTransactionsDeclared!ELEMENT],
null as [Entities!3],
null as [Entity!4!CustomerVATId!ELEMENT],
null as [Leases!5],
null as [Lease!6!LeaseIdentifier!ELEMENT],
null as [Invoices!7],
null as [Invoice!8!OrderId!ELEMENT]
union all
--root/header
select 2, -- 2 = header
1,
null,
'044', -- 2!MessageID
'1047', -- 2!TotalNumberOfTransactionsDeclared
null, null, null, null, null, null
union all
--root/entities
select 3, -- 3 = entities
1,
null, null, null,
null, -- 3
null, null, null, null, null
union all
--root/entities/entity
select 4, -- 4 = entity
3,
null, null, null, null,
'100050301900003', -- 4!CustomerVATId
null, null, null, null
union all
--root/entities/entity/leases
select 5, -- 5 = leases
4,
null, null, null, null, null,
null, -- 5
null, null, null
union all
--root/entities/entity/leases/lease
select 6, -- 6 = lease
5,
null, null, null, null, null, null,
'4374', -- 6!LeaseIdentifier
null, null
union all
--root/entities/entity/leases/invoices
select 7, -- 7 = invoices
6,
null, null, null, null, null, null, null,
null, -- 7
null
union all
--root/entities/entity/leases/invoices/invoice
select 8, -- 8 = invoices
7,
null, null, null, null, null, null, null, null,
'INV0001' -- 8!OrderId
for xml explicit;
Result
<Root><Header><MessageId>044</MessageId><TotalNumberOfTransactionsDeclared>1047</TotalNumberOfTransactionsDeclared></Header><Entities><Entity><CustomerVATId>100050301900003</CustomerVATId><Leases><Lease><LeaseIdentifier>4374</LeaseIdentifier><Invoices><Invoice><OrderId>INV0001</OrderId></Invoice></Invoices></Lease></Leases></Entity></Entities></Root>
After formatting:
<Root>
<Header>
<MessageId>044</MessageId>
<TotalNumberOfTransactionsDeclared>1047</TotalNumberOfTransactionsDeclared>
</Header>
<Entities>
<Entity>
<CustomerVATId>100050301900003</CustomerVATId>
<Leases>
<Lease>
<LeaseIdentifier>4374</LeaseIdentifier>
<Invoices>
<Invoice>
<OrderId>INV0001</OrderId>
</Invoice>
</Invoices>
</Lease>
</Leases>
</Entity>
</Entities>
</Root>