2012-07-24 88 views
2

我正在尋找將XML文件讀入SQL Server 2008 R2數據表的幫助。將xml文件導入到sql server表中

我的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

使用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

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); 

這得到<e_objects>下的所有<item>節點的列表爲X(xmldata)。從這些元素,我再選擇

  • <item>節點本身的item_id屬性
  • 包含<item>節點

而且裏面的<class>/<class_name>元素:我會用NCHAR太多建議 - 這是固定長度,即它總是10或20個字符 - 即使你的字符串只有2個字符。不是一個好主意,大多數類型 - 使用NVARCHAR(20)而不是 - 好得多,對於字符串長度> = 5!