使用 OpenXml 插入 SQL
Posted
技术标签:
【中文标题】使用 OpenXml 插入 SQL【英文标题】:Inserting into SQL using an OpenXml 【发布时间】:2013-10-13 14:30:27 【问题描述】:您好,我正在尝试使用 XML 文件将数据插入到 SQL Server 数据库中,该文件具有如下一些数据。我能够在 OPENXML 中进行属性映射。如果我尝试将 XML 作为元素而不是属性传递我得到一个关于空插入的错误。
以下是我的 XML 文件(包含属性)
<NewDataSet>
<SampleDataTable id="20" Name="as" Address="aaa" Email="aa" Mobile="123" />
</NewDataSet>
我成功使用上述格式。如果我使用以下格式,我会遇到错误
<Customer>
<Id>20</Id>
<Name>Cn</Name>
<Address>Pa</Address>
<Email>bnso@gmail.com</Email>
<Mobile>12345513213</Mobile>
</Customer>
这是我在 SQL 中的 openXML
insert into @tempTable
select * from openxml (@xmlHandle,'ROOT/Customer/',1)
with (Cust_id int '@id',
Customer_Name varchar(30) '@Name',
Address varchar(30) '@Address',
Email_id varchar(30) '@Email',
Mobile_no bigint '@Mobile'
)
Insert into Test.dbo.tblCustomers (Cust_id,Customer_Name,Address,Email,Mobile_No) (select * from @tempTable)
请帮忙
【问题讨论】:
【参考方案1】:这是因为您试图将数据作为属性获取,但您的 xml 数据在元素内部。试试这个:
insert into @tempTable
select *
from openxml (@xmlHandle,'ROOT/Customer/',1)
with (Cust_id int '@id',
Customer_Name varchar(30) 'Name[1]',
Address varchar(30) 'Address[1]',
Email_id varchar(30) 'Email[1]',
Mobile_no bigint 'Mobile[1]'
)
或者你也可以不使用 openxml:
select
t.c.value('Name[1]', 'varchar(30)') as Name,
t.c.value('Address[1]', 'varchar(30)') as Address,
t.c.value('Email[1]', 'varchar(30)') as Email,
t.c.value('Mobile[1]', 'bigint') as Mobile
from @Data.nodes('Customer') as t(c)
sql fiddle demo
【讨论】:
感谢您的回复。我有超过 1 个客户详细信息,我该如何处理 知道了.. 真的很有帮助...谢谢,【参考方案2】:问题是“元素值”与“元素属性”。
这个页面有两个很好的例子:
http://technet.microsoft.com/en-us/library/ms187897%28v=sql.90%29.aspx
<Customer>
<CustomerID>LILAS</CustomerID>
<ContactName>Carlos Gonzlez</ContactName>
<Order OrderID="10283" CustomerID="LILAS" EmployeeID="3" OrderDate="1996-08-16T00:00:00">
<OrderDetail ProductID="72" Quantity="3"/>
</Order>
</Customer>
</ROOT>'
-- Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @XmlDocumentHandle OUTPUT, @XmlDocument
-- Execute a SELECT statement using OPENXML rowset provider.
SELECT *
FROM OPENXML (@XmlDocumentHandle, '/ROOT/Customer',2)
WITH (CustomerID varchar(10),
ContactName varchar(20))
EXEC sp_xml_removedocument @XmlDocumentHandle
【讨论】:
以上是关于使用 OpenXml 插入 SQL的主要内容,如果未能解决你的问题,请参考以下文章
在Word2007中,如何通过Range.InsertXML方法将一个OpenXML插入到空白文档中?
dotnet OpenXML 利用合并表格单元格在 PPT 文档插入不可见的额外版权信息