我正在尝试使用TSQL生成一些XML并遇到一些麻烦,我能够遍历2个级别,但却陷入了3.如何在我发布的示例中工作,你必须购买订单,第一个采购订单只有一个零件,该零件有一个版本。第二个采购订单分为两部分,每部分都有自己的发布。最后,我应该有2个XML文档遍历3个级别,发布/部分/采购订单。我认为在链接到下一阶段以及分组时我感到困惑。示例仅显示2个部分,但是一个采购订单可能有很多部件,但每个部件只有一个版本,任何帮助都将非常感谢。
DECLARE @sdv AS TABLE
(
PID INT IDENTITY(1,1) PRIMARY KEY,
PurchaseOrder varchar(20),
PartNo int,
Release int
)
INSERT INTO @sdv values ('PURC123', 111, 1)
INSERT INTO @sdv values ('PURC333', 222, 1)
INSERT INTO @sdv values ('PURC333', 333, 1)
select
PurchaseOrder,
(
select
PartNo,
(
select
Release
from
@sdv a3
where
a3.Release = a2.Release and
a3.PartNo = a2.PartNo and
a3.PurchaseOrder = a1.PurchaseOrder
for xml path('Release'), type
)
from
@sdv a2
where
a2.PartNo = a1.PartNo
group by a2.PartNo
for xml path('part'), type
) from @sdv a1
group by PurchaseOrder
for xml path('Purchase')
答案 0 :(得分:2)
我打算给你一个答案,这样你就可以玩它了。我今天要多一点,但明天会回来。
对于这个例子,我只使用了属性,因为我可以更容易地阅读它。我使用CTE进行了分组,并假设部件和发布之间的关系为1到1。 (可能是错误的,但需要你的信息)。关于需要深入第三的水平也有点模糊。如果我们讨论的是部件(版本)的迭代,那么你可以简单地将@Release添加到第二级。注意:如果您不想要属性,只需删除@before中的每个标记。
我强烈建议您在进行分层xml工作时非常勤勉地使用代码格式。它很容易迷失。
<强> CODE 强>
DECLARE @sdv AS TABLE
(
PID INT IDENTITY(1,1) PRIMARY KEY,
PurchaseOrder varchar(20),
PartNo int,
Release int
)
INSERT INTO @sdv values ('PURC123', 111, 1)
INSERT INTO @sdv values ('PURC333', 222, 1)
INSERT INTO @sdv values ('PURC333', 333, 1)
;WITH PO AS (
SELECT DISTINCT PurchaseOrder
FROM @sdv
)
SELECT L1.PurchaseOrder AS "@PurchseOrder",
( SELECT PartNo AS "@PartNo",
( SELECT DISTINCT L3.Release AS "@Release"
FROM @sdv AS L3
WHERE L2.PartNo = L3.PartNo
ORDER BY L3.Release ASC
FOR XML PATH('RELEASE'),TYPE
)
FROM @sdv AS L2
WHERE L2.PurchaseOrder = L1.PurchaseOrder
FOR XML PATH('PART'), TYPE
)
FROM PO AS L1
FOR XML PATH('PurchaseOrder'), ROOT('PurchaseOrders')
XML OUTPUT
<PurchaseOrders>
<PurchaseOrder PurchseOrder="PURC123">
<PART PartNo="111">
<RELEASE Release="1" />
</PART>
</PurchaseOrder>
<PurchaseOrder PurchseOrder="PURC333">
<PART PartNo="222">
<RELEASE Release="1" />
</PART>
<PART PartNo="333">
<RELEASE Release="1" />
</PART>
</PurchaseOrder>
</PurchaseOrders>