每当您看到带编号的名称(Policy1、Policy2... 或 Customer1、Customer2)时,您就可以肯定,存在糟糕的设计!
在您的情况下,您似乎想使用列值作为元素名称。那是你真的不应该做的事情!
假设有一个带有 ID 和 Name 的客户表和一个带有 ID、CustomerID 和 Number 的策略表,它可能如下所示:
DECLARE @customer TABLE(ID INT,Name VARCHAR(100));
INSERT INTO @customer VALUES(1,'cust 1'),(2,'cust 2'),(3,'cust 3');
DECLARE @policy TABLE(ID INT,CustomerID INT,Number VARCHAR(100));
INSERT INTO @policy VALUES
(1,1,'p1 for c1'),(2,1,'p2 for c1')
,(3,2,'p1 for c2'),(4,2,'p2 for c2'),(5,2,'p3 for c2')
--no policy for c3
SELECT ID AS [@id]
,Name AS [@name]
,(
SELECT ID AS [@id]
,Number AS [@number]
FROM @policy AS p
WHERE p.CustomerID=c.ID
FOR XML PATH('policy'),ROOT('policies'),TYPE
)
FROM @customer AS c
FOR XML PATH('Customer')
结果
<Customer id="1" name="cust 1">
<policies>
<policy id="1" number="p1 for c1" />
<policy id="2" number="p2 for c1" />
</policies>
</Customer>
<Customer id="2" name="cust 2">
<policies>
<policy id="3" number="p1 for c2" />
<policy id="4" number="p2 for c2" />
<policy id="5" number="p3 for c2" />
</policies>
</Customer>
<Customer id="3" name="cust 3" />
提示
你可以让,ROOT('policies')离开(不推荐)