“ModifiedBy”后面的逗号好像不对……
并且避免特定文化的日期格式!:您的<CreatedDate>02/06/2016</CreatedDate> 可以被视为 6 月 2 日或 2 月 6 日,甚至可能引发异常。在 XML 中使用 ISO8601 和 in SQL you should prefer ODBC, ISO or Universal-Unseparated
现在回答你的问题
这看起来像一个 1:n 相关的结构。但是没有提示关系(通用键)。
如果这是一个 1:n 相关的结构,我会假设,可能有几个“Fo”条目具有不同数量的 Pro 条目。在这种情况下,最好用自己的“Pros”元素标签封装所有“Pro”元素,以将它们与其他元素分开:
在我的测试场景中,我在“tblB”中添加了一列“ANumber”作为外键,并在“Fo”中添加了两行,在“tblB”中包含子行。
此外,如果您的示例中只有一个“fo”元素,我添加了一个您不需要的通用根。
提示:
如果你想为你的“Pro”元素添加一个封装元素,只需将内部的SELECT 更改为FOR XML PATH('Pro'),ROOT('Pros'),TYPE:
示例
DECLARE @tblA TABLE(Number INT,CreatedDate DATETIME,CreatedBy INT,ModifiedDate DATETIME,ModifiedBy INT);
INSERT INTO @tblA VALUES
(1,{d'2016-06-02'},1,{d'2016-06-02'},1)
,(2,{d'2016-07-02'},1,{d'2016-07-02'},1);
DECLARE @tblB TABLE(Number INT, ANumber INT,LotNumber VARCHAR(100));
INSERT INTO @tblB VALUES
(1,1,'Lot 1288')
,(2,1,'Lot 1299')
,(3,1,'Lot 1211')
,(1,2,'Lot 222a')
,(2,2,'Lot 222b');
SELECT tblA.*
,(
SELECT tblB.Number
,tblB.LotNumber
FROM @tblB AS tblB
WHERE tblB.ANumber=tblA.Number
FOR XML PATH('Pro'),TYPE
)
FROM @tblA AS tblA
FOR XML PATH('Fo'),ROOT('root')
结果
<root>
<Fo>
<Number>1</Number>
<CreatedDate>2016-06-02T00:00:00</CreatedDate>
<CreatedBy>1</CreatedBy>
<ModifiedDate>2016-06-02T00:00:00</ModifiedDate>
<ModifiedBy>1</ModifiedBy>
<Pro>
<Number>1</Number>
<LotNumber>Lot 1288</LotNumber>
</Pro>
<Pro>
<Number>2</Number>
<LotNumber>Lot 1299</LotNumber>
</Pro>
<Pro>
<Number>3</Number>
<LotNumber>Lot 1211</LotNumber>
</Pro>
</Fo>
<Fo>
<Number>2</Number>
<CreatedDate>2016-07-02T00:00:00</CreatedDate>
<CreatedBy>1</CreatedBy>
<ModifiedDate>2016-07-02T00:00:00</ModifiedDate>
<ModifiedBy>1</ModifiedBy>
<Pro>
<Number>1</Number>
<LotNumber>Lot 222a</LotNumber>
</Pro>
<Pro>
<Number>2</Number>
<LotNumber>Lot 222b</LotNumber>
</Pro>
</Fo>
</root>