Sql server 在表中添加XML文件的不同节点/标记

Sql server 在表中添加XML文件的不同节点/标记,sql-server,tsql,Sql Server,Tsql,我正在尝试解析包含如下数据的XML: <Orders> <Order> <OrderHeader Shop="7894" ClientNo="45678" ClientDescr="Here Client Description" OrderID="7898" OrderDate="20160505" DelivDate="20160606" Comment="" Pricelevel="myLevel" Total="124"/> <

我正在尝试解析包含如下数据的XML:

<Orders>
  <Order>
  <OrderHeader Shop="7894" ClientNo="45678" ClientDescr="Here Client Description" OrderID="7898" OrderDate="20160505" DelivDate="20160606" Comment="" Pricelevel="myLevel" Total="124"/>   
  <ItemSold Product="63636" ItemText="New item" Qty="6" Delivery="" Price="24" />
  <ItemSold Product="4564" ItemText="Item Text here" Qty="6" Delivery="" Price="456" />
  <ItemRefund Product="555" ItemText="Item Text here" ItemType="B" Qty="1" Delivery="" Price="20" />
  </Order>
</Orders>
对于订单标题,我可能需要另一个表,然后用它创建一个外键。

您可以使用

XML和所有表定义

DECLARE @xml XML = N'<Orders>
  <Order>
  <OrderHeader Shop="7894" ClientNo="45678" ClientDescr="Here Client Description" OrderID="7898" OrderDate="20160505" DelivDate="20160606" Comment="" Pricelevel="myLevel" Total="124"/>   
  <ItemSold Product="63636" ItemText="New item" Qty="6" Delivery="" Price="24" />
  <ItemSold Product="4564" ItemText="Item Text here" Qty="6" Delivery="" Price="456" />
  <ItemRefund Product="555" ItemText="Item Text here" ItemType="B" Qty="1" Delivery="" Price="20" />
  </Order>
  <Order>
  <OrderHeader Shop="7894" ClientNo="45678" ClientDescr="Here Client Description" OrderID="8000" OrderDate="20160505" DelivDate="20160606" Comment="" Pricelevel="myLevel" Total="124"/>   
  <ItemSold Product="63636" ItemText="New item" Qty="6" Delivery="" Price="24" />
  <ItemSold Product="4564" ItemText="Item Text here" Qty="6" Delivery="" Price="456" />
  <ItemRefund Product="555" ItemText="Item Text here" ItemType="B" Qty="1" Delivery="" Price="20" />
  </Order>
</Orders>'


DECLARE @Order AS TABLE
(
    OrderId int
    --- and other fields in orderheader
)

DECLARE @ItemSold AS TABLE
(
    OrderId int, -- foreign key
    Product int,
    ItemText varchar(200),
    Qty int,
    Delivery varchar(200),
    Price decimal(10,2)
)

DECLARE @Refund AS TABLE
(   
    OrderId int, -- foreign key
    Product int,
    ItemType varchar(5),
    ItemText varchar(200),
    Qty int,
    Delivery varchar(200),
    Price decimal(10,2)
)
出售物品信息

INSERT INTO @Order
(
    OrderId
)
SELECT 
    x.t.value('(./@OrderID)[1]', 'int') 
FROM @xml.nodes('/Orders/Order/OrderHeader') AS x(t)
;WITH temp AS
(   SELECT 
      x.t.value('(./OrderHeader/@OrderID)[1]', 'int') AS OrderId,
      x.t.query('./ItemSold') AS ItemSolds
    FROM @xml.nodes('/Orders/Order') AS x(t)
)
INSERT INTO @ItemSold
(
    OrderId,
    Product,
    ItemText,
    Qty,
    Delivery,
    Price
)
SELECT 
       t.OrderId,
       a.Product,
       a.ItemText,
       a.Qty,
       a.Delivery,
       a.Price
FROM temp t
OUTER APPLY
(
    SELECT 
         x.t.value('(./@Product)[1]', 'int') AS Product ,
         x.t.value('(./@ItemText)[1]', 'varchar(200)') AS ItemText,
         x.t.value('(./@Qty)[1]', 'int') AS Qty ,
         x.t.value('(./@Delivery)[1]', 'varchar(200)') AS Delivery,
         x.t.value('(./@Price)[1]', 'decimal(10,2)') AS Price 
    FROM t.ItemSolds.nodes('/ItemSold') AS x(t)
) a
;WITH temp AS
(   SELECT 
      x.t.value('(./OrderHeader/@OrderID)[1]', 'int') AS OrderId,
      x.t.query('./ItemRefund') AS ItemRefunds
    FROM @xml.nodes('/Orders/Order') AS x(t)
)
INSERT INTO @Refund
(
    OrderId,
    Product,
    ItemText,
    Qty,
    Delivery,
    Price,
    ItemType
)
SELECT 
       t.OrderId,
       a.Product,
       a.ItemText,
       a.Qty,
       a.Delivery,
       a.Price,
       a.ItemType
FROM temp t
OUTER APPLY
(
    SELECT 
         x.t.value('(./@Product)[1]', 'int') AS Product ,
         x.t.value('(./@ItemText)[1]', 'varchar(200)') AS ItemText,
         x.t.value('(./@Qty)[1]', 'int') AS Qty ,
         x.t.value('(./@Delivery)[1]', 'varchar(200)') AS Delivery,
         x.t.value('(./@Price)[1]', 'decimal(10,2)') AS Price,
         x.t.value('(./@ItemType)[1]', 'varchar(5)') AS ItemType
    FROM t.ItemRefunds.nodes('/ItemRefund') AS x(t)
) a
获取退款项目信息

INSERT INTO @Order
(
    OrderId
)
SELECT 
    x.t.value('(./@OrderID)[1]', 'int') 
FROM @xml.nodes('/Orders/Order/OrderHeader') AS x(t)
;WITH temp AS
(   SELECT 
      x.t.value('(./OrderHeader/@OrderID)[1]', 'int') AS OrderId,
      x.t.query('./ItemSold') AS ItemSolds
    FROM @xml.nodes('/Orders/Order') AS x(t)
)
INSERT INTO @ItemSold
(
    OrderId,
    Product,
    ItemText,
    Qty,
    Delivery,
    Price
)
SELECT 
       t.OrderId,
       a.Product,
       a.ItemText,
       a.Qty,
       a.Delivery,
       a.Price
FROM temp t
OUTER APPLY
(
    SELECT 
         x.t.value('(./@Product)[1]', 'int') AS Product ,
         x.t.value('(./@ItemText)[1]', 'varchar(200)') AS ItemText,
         x.t.value('(./@Qty)[1]', 'int') AS Qty ,
         x.t.value('(./@Delivery)[1]', 'varchar(200)') AS Delivery,
         x.t.value('(./@Price)[1]', 'decimal(10,2)') AS Price 
    FROM t.ItemSolds.nodes('/ItemSold') AS x(t)
) a
;WITH temp AS
(   SELECT 
      x.t.value('(./OrderHeader/@OrderID)[1]', 'int') AS OrderId,
      x.t.query('./ItemRefund') AS ItemRefunds
    FROM @xml.nodes('/Orders/Order') AS x(t)
)
INSERT INTO @Refund
(
    OrderId,
    Product,
    ItemText,
    Qty,
    Delivery,
    Price,
    ItemType
)
SELECT 
       t.OrderId,
       a.Product,
       a.ItemText,
       a.Qty,
       a.Delivery,
       a.Price,
       a.ItemType
FROM temp t
OUTER APPLY
(
    SELECT 
         x.t.value('(./@Product)[1]', 'int') AS Product ,
         x.t.value('(./@ItemText)[1]', 'varchar(200)') AS ItemText,
         x.t.value('(./@Qty)[1]', 'int') AS Qty ,
         x.t.value('(./@Delivery)[1]', 'varchar(200)') AS Delivery,
         x.t.value('(./@Price)[1]', 'decimal(10,2)') AS Price,
         x.t.value('(./@ItemType)[1]', 'varchar(5)') AS ItemType
    FROM t.ItemRefunds.nodes('/ItemRefund') AS x(t)
) a
演示链接: