我正在寻找将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>
我的create table 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);
非常感谢任何帮助。感谢
答案 0 :(得分:6)
嗯,首先 - 你再次,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)
代替 - 更好,对于字符串长度&gt; = 5!
答案 1 :(得分:1)
创建一个包含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