【问题标题】:import xml file into sql server table将xml文件导入sql server表
【发布时间】: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);

任何帮助将不胜感激。谢谢

【问题讨论】:

    标签: xml


    【解决方案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

      【讨论】:

        猜你喜欢
        • 2018-05-06
        • 1970-01-01
        • 2012-07-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-08
        • 2023-03-04
        • 1970-01-01
        相关资源
        最近更新 更多