簡體   English   中英

在TSQL中使用外部節點包裝內部XML節點

[英]Wrapping inner XML nodes with an outer node in TSQL

采用以下TSQL

SELECT 
    o.id as '@id',
    (SELECT 
         op.id as '@orderid'
     FROM 
         Orders o
     INNER JOIN 
         OrderParts op ON o.id = op.orderId
     FOR XML PATH ('orderpart'), TYPE)
FROM 
    Orders o
FOR XML PATH ('order'), ROOT('application')

從這些表生成。

命令

Id   type
----------------
1    Pending
2    Active

訂購零件

id   orderid
-------------
1       1
2       1
3       3
4       2

它生成這個XML

<application>
  <order id="1">
    <orderpart orderid="1" />
    <orderpart orderid="2" />
    <orderpart orderid="3" />
    <orderpart orderid="4" />
  </order>
  <order id="2">
    <orderpart orderid="1" />
    <orderpart orderid="2" />
    <orderpart orderid="3" />
    <orderpart orderid="4" />
  </order>
</application>

如何在訂單和訂單部分周圍使用TSQL添加外部復數標簽,使其如下所示?

<application>
  <orders>
    <order id="1">
      <orderparts>
        <orderpart orderid="1" />
        <orderpart orderid="2" />
        <orderpart orderid="3" />
        <orderpart orderid="4" />
      </orderparts>
    </order>
    <order id="2">
      <orderparts>
        <orderpart orderid="1" />
        <orderpart orderid="2" />
        <orderpart orderid="3" />
        <orderpart orderid="4" />
      </orderparts>
    </order>
  </orders>
</application>

謝謝!

SELECT 
(
     SELECT o.id AS '@id',
     (
          SELECT op.id as '@orderid'
          FROM OrderParts op 
          WHERE op.orderID = o.ID
          FOR XML PATH ('orderpart'), TYPE
     ) AS 'OrderParts'
     FROM Orders o
     FOR XML PATH ('order'),TYPE
 )
 FOR XML PATH ('orders'),ROOT('application')

你非常接近 - 只需在這里添加和/或調整一些列別名......

SELECT 
    o.id as 'order/@id',
    (SELECT 
         op.id as '@orderid'
     FROM 
         Orders o
     INNER JOIN 
         OrderParts op ON o.id = op.orderId
     FOR XML PATH ('orderpart'), TYPE) AS 'order/orderparts'
FROM 
    Orders o
FOR XML PATH ('orders'), ROOT('application')

應該這樣做! :-)

樣本表

CREATE TABLE #Orders(Id INT,[type] VARCHAR(100))

INSERT INTO #Orders
SELECT 1,    'Pending'
UNION ALL
SELECT 2,    'Active'

CREATE TABLE [#Order Parts](Id INT,orderid INT)

INSERT INTO [#Order Parts]
SELECT 1,   1
UNION ALL
SELECT 2,   1
UNION ALL
SELECT 3,   3
UNION ALL
SELECT 4,   2

QUERY

1.使用每個Id的所有可能性(您的預期輸出)

;WITH CTE(orderid,orderpartid) AS
(
    SELECT ODR.id orderid ,ODRP.Id orderpartid
    FROM #Orders ODR
    CROSS JOIN [#Order Parts] ODRP 
)
,CTE2 AS
(
   -- This SELECT is used to name the xml data column
    select 
    (
        -- We take orders as the root node
        select t1.orderid as 'order/@Id',
        (
            SELECT T.orderpartid '@orderid' 
            FROM CTE T
            WHERE T.orderid=t1.orderid
            FOR XML PATH('orderpart'), type
        )as 'order/orderparts' 
        from    CTE t1
        group by t1.orderid
        for xml path(''), root('orders')
    )XMLDATA    
)
-- We take application as the root node for orders
select CAST(XMLDATA AS XML)
FROM CTE2
for xml path('application')

結果

在此輸入圖像描述

2.為每個Id選擇匹配元素

;WITH CTE(orderid,orderpartid) AS
(
    SELECT ODR.id orderid ,ODRP.Id orderpartid
    FROM #Orders ODR
    JOIN [#Order Parts] ODRP ON ODR.id = ODRP.orderId
)
,CTE2 AS
(
    select 
    (
        select t1.orderid as 'order/@Id',
        (
            SELECT T.orderpartid '@orderid' 
            FROM CTE T
            WHERE T.orderid=t1.orderid
            FOR XML PATH('orderpart'), type
        )as 'order/orderparts' 
        from    CTE t1
        group by t1.orderid
        for xml path(''), root('orders')
    )XMLDATA    
)
select CAST(XMLDATA AS XML)
FROM CTE2
for xml path('application')

結果

在此輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM