将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 文件的结构。您的 &lt;class_name&gt; 元素在 &lt;class&gt; 元素内,并且又在 &lt;item&gt; 节点内。所以你需要做出相应的选择。

另外:您选择 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);

这将获取&lt;e_objects&gt; 下所有&lt;item&gt; 节点的列表,即X(xmldata)。然后从这些元素中选择

&lt;item&gt; 节点本身的 item_id 属性 &lt;item&gt; 节点中包含的 &lt;class&gt;/&lt;class_name&gt; 元素

另外:我建议 不要 过多地使用 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?

sql 将Excel文件导入为SQL Server表

将txt文件内容导入sql server 数据库表中

如何将 XML 文件(在本例中为业务流程事件日志)导入和查询到 SQL Server Express?

使用 SSIS 将具有多个表的单个 mdb 文件动态导入 SQL Server?