使用TSQL生成XML

时间:2015-07-09 15:22:36

标签: sql xml tsql

我正在尝试使用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')

1 个答案:

答案 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>