将xml文件导入sql server表
Posted
技术标签:
【中文标题】将xml文件导入sql server表【英文标题】:import xml file into sql server table 【发布时间】:2012-07-24 12:57:29 【问题描述】:我正在寻求帮助,将 XML 文件读入 SQL Server 2008 R2 数据表。
我的 XML 文件如下所示:
<?xml version="1.0" encoding="utf-8"?>
<e_objects xmlns="http://www.blank.info/ns/2012/objects">
<item item_id="41-FE-001">
<class display="true">
<class_name>FEEDER</class_name>
</class>
</item>
</e_objects>
我的创建表 SQL 如下所示:
CREATE TABLE [dbo].[handover_data](
[item_id] [nchar](15) NULL,
[class] [nchar](10) NULL,
) ON [PRIMARY]
GO
这是我正在使用的 SQL。我无法让它返回任何值:
SELECT xmldata.value('(item[@name="item_id"]/@value)[1])', 'NCHAR') AS item_id,
xmldata.value('(class_name)', 'NCHAR') AS class
FROM (
SELECT CAST(x AS XML)
FROM OPENROWSET(BULK 'C:\xmlfile.xml',
SINGLE_BLOB) AS T(x)) AS T(x)
CROSS APPLY x.nodes('e_objects/*') AS X(xmldata);
任何帮助将不胜感激。谢谢
【问题讨论】:
【参考方案1】:好吧,首先 - 你又来了,like in your last question which I already answered,忽略 XML 命名空间 - 不要!
<e_objects xmlns="http://www.blank.info/ns/2012/objects">
*********************************************
这就是 XML 命名空间 - 它的存在是有原因的 - 不要忽略它!
那么您就没有注意 XML 文件的结构。您的 <class_name>
元素在 <class>
元素内,并且又在 <item>
节点内。所以你需要做出相应的选择。
另外:您选择 XML 属性的语法无效;查看我的示例 - 这对您有用吗?
试试这样的:
;WITH XMLNAMESPACES(DEFAULT 'http://www.blank.info/ns/2012/objects')
SELECT
xmldata.value('(@item_id)[1]', 'NCHAR(10)') AS item_id,
xmldata.value('(class/class_name)[1]', 'NCHAR(20)') AS class
FROM
(SELECT CAST(x AS XML)
FROM OPENROWSET(BULK 'C:\xmlfile.xml',
SINGLE_BLOB) AS T(x)) AS T(x)
CROSS APPLY
x.nodes('/e_objects/item') AS X(xmldata);
这将获取<e_objects>
下所有<item>
节点的列表,即X(xmldata)
。然后从这些元素中选择
<item>
节点本身的 item_id
属性
<item>
节点中包含的 <class>/<class_name>
元素
另外:我建议 不要 过多地使用 NCHAR
- 它是 固定长度,即它总是 10 或 20 个字符长 - 即使您的字符串只是2个字符。不是一个好主意,大多数类型 - 使用 NVARCHAR(20)
代替 - 对于字符串长度 >= 5 更好!
【讨论】:
【参考方案2】:创建一个带有 xml 列的表来存储该列。试试这个,对我来说很好用
CREATE TABLE XmlImportTest
(
xmlFileName VARCHAR(300),
xml_data xml
)
GO
DECLARE @xmlFileName VARCHAR(300)
SELECT @xmlFileName = 'C:\xmlPath.xml'
-- dynamic sql is just so we can use @xmlFileName variable in OPENROWSET
EXEC('
INSERT INTO XmlImportTest(xmlFileName, xml_data)
SELECT ''' + @xmlFileName + ''', xmlData
FROM
(
SELECT *
FROM OPENROWSET (BULK ''' + @xmlFileName + ''' , SINGLE_BLOB) AS XMLDATA
) AS FileImport (XMLDATA)
')
GO
SELECT * FROM XmlImportTest
DROP TABLE XmlImportTest
参考: http://weblogs.sqlteam.com/mladenp/archive/2007/06/18/60235.aspx
【讨论】:
以上是关于将xml文件导入sql server表的主要内容,如果未能解决你的问题,请参考以下文章
将 XML 文件导入 SQL Server 时唯一标识符转换失败
在将新文件主动写入源目录时,如何安全地将文件导入 ssis 中的 sql server?