Sql server 在表中添加XML文件的不同节点/标记
我正在尝试解析包含如下数据的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"/> <
<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
演示链接: