我假设标识列CustomerID
和是您和表OrderID
中的主键,并且您在. 我使用and来定位要在. 如果 XML 中的 Customer 有可能已经在 Customer 表中,您应该使用子句从插入中排除这些行。Customers
Orders
CustomerID
Orders
CustomerName
ContactName
CustomerID
Orders.CustomerID
where not exists
第一个是使用像@Richard 在他的评论中建议的 XML 变量的版本。
declare @Customers table (CustomerID int identity, ContactName varchar(50), CompanyName varchar(50))
declare @Orders table (OrderID int identity, CustomerID int, OrderDate datetime)
declare @xml as xml = '
<Customers ContactName="Joe" CompanyName="Company1">
<Orders OrderDate="2000-08-25T00:00:00"/>
<Orders OrderDate="2000-10-03T00:00:00"/>
</Customers>
<Customers ContactName="Steve" CompanyName="Company2">
<Orders OrderDate="2000-10-03T00:00:00"/>
</Customers>'
insert into @Customers (ContactName, CompanyName)
select
c.value('@ContactName', 'varchar(50)'),
c.value('@CompanyName', 'varchar(50)')
from @xml.nodes('Customers') as n(c)
;with cteOrders as
(
select
o.value('@OrderDate', 'DateTime') as OrderDate,
o.value('../@ContactName', 'varchar(50)') as ContactName,
o.value('../@CompanyName', 'varchar(50)') as CompanyName
from @xml.nodes('Customers/Orders') as n(o)
)
insert into @Orders (CustomerID, OrderDate)
select C.CustomerID, O.OrderDate
from cteOrders as O
inner join @Customers as C
on C.CompanyName = O.CompanyName and
C.ContactName = O.ContactName
第二个版本使用openxml
. 如果您使用openxml
只能有一个根元素,所以我在您的示例 XML 中添加了一个根元素。
declare @Customers table (CustomerID int identity, ContactName varchar(50), CompanyName varchar(50))
declare @Orders table (OrderID int identity, CustomerID int, OrderDate datetime)
declare @xml as xml = '
<root>
<Customers ContactName="Joe" CompanyName="Company1">
<Orders OrderDate="2000-08-25T00:00:00"/>
<Orders OrderDate="2000-10-03T00:00:00"/>
</Customers>
<Customers ContactName="Steve" CompanyName="Company2">
<Orders OrderDate="2000-10-03T00:00:00"/>
</Customers>
</root>'
declare @idoc int
exec sp_xml_preparedocument @idoc out, @XML
insert into @Customers (ContactName, CompanyName)
select C.ContactName, C.CompanyName
from openxml(@idoc, '/root/Customers', 0) with
(ContactName varchar(50),
CompanyName varchar(50)) as C
insert into @Orders (CustomerID, OrderDate)
select C.CustomerID, OrderDate
from openxml(@idoc, '/root/Customers/Orders', 0) with
(OrderDate datetime,
ContactName varchar(50) '../@ContactName',
CompanyName varchar(50) '../@CompanyName') as O
inner join @Customers as C
on C.CompanyName = O.CompanyName and
C.ContactName = O.ContactName
exec sp_xml_removedocument @idoc