我正在寻求将 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);
如有任何帮助,我们将不胜感激。谢谢
最佳答案
好吧,首先 - 你又来了,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);
这会获取所有 <item>
的列表<e_objects>
下的节点作为X(xmldata)
.然后我从这些元素中选择
item_id
<item>
上的属性节点本身<class>/<class_name>
<item>
中包含的元素节点
另外:我建议不要使用NCHAR
太多 - 它是固定长度,即它总是 10 或 20 个字符长 - 即使您的字符串只有 2 个字符。不是一个好主意,大多数类型 - 使用 NVARCHAR(20)
相反 - 对于字符串长度 >= 5 更好!
关于xml - 将 xml 文件导入到 sql server 表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11631352/