2

我正在寻求帮助,将 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);

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

4

2 回答 2

6

好吧,首先——你又一次,就像我已经回答的最后一个问题一样忽略了 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);

这将获取as<item>下所有节点的列表。然后从这些元素中选择<e_objects>X(xmldata)

  • 节点本身的item_id属性<item>
  • 节点内包含的<class>/<class_name>元素<item>

另外:我建议不要使用NCHAR太多——它是固定长度的,即它总是 10 或 20 个字符长——即使你的字符串只有 2 个字符。不是一个好主意,大多数类型 -NVARCHAR(20)改为使用 - 更好,字符串长度 >= 5 !

于 2012-07-24T13:33:34.960 回答
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

于 2012-07-24T13:19:40.650 回答