将xml文件导入sql server表

时间:2012-07-24 12:57:30

标签: xml

我正在寻找将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);

非常感谢任何帮助。感谢

2 个答案:

答案 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