2012-08-17 75 views
1

我需要解析我的XML文件並將解析的XML保存到SQL數據庫。我的XML內容有幾個標籤<goods_item>。如果它只包含一個標籤,它可以正常工作。但也有錯誤。將XML傳遞到SQL

SQL查詢:

declare @insert nvarchar(4000), @pathname varchar(200), @xml xml 
set @pathname = 'D:\Tests\price1.xml' 
create table #tmp_xml(xmldata xml) 
set @insert = 'INSERT INTO #tmp_xml(xmldata) SELECT bulkcolumn 
     FROM OPENROWSET (BULK N''' + @pathname+ ''', SINGLE_BLOB) AS data' 
exec sp_executesql @insert 
select @xml = xmldata from #tmp_xml 

INSERT INTO XML_import 
SELECT 
Tbl.Col.value('goods_level[1]','int'), 
Tbl.Col.value('goods_isgroup[1]', 'NVARCHAR(50)'), 
Tbl.Col.value('goods_code[1]', 'NVARCHAR(50)'), 
Tbl.Col.value('goods_name[1]', 'NVARCHAR(50)'), 
Tbl.Col.value('goods_parent[1]', 'NVARCHAR(50)'), 
Tbl.Col.value('goods_art[1]', 'NVARCHAR(50)'), 
Tbl.Col.value('goods_buhart[1]', 'NVARCHAR(50)'), 
Tbl.Col.value('goods_inpack[1]', 'NVARCHAR(50)'), 
Tbl.Col.value('goods_packtxt[1]', 'NVARCHAR(50)'), 
Tbl.Col.value('goods_country[1]', 'NVARCHAR(50)'), 
Tbl.Col.value('goods_gtd[1]', 'NVARCHAR(50)'), 
Tbl.Col.value('goods_nds[1]', 'NVARCHAR(50)'), 
Tbl.Col.value('goods_unit[1]', 'NVARCHAR(50)') 
FROM @xml.nodes('//goods_item') Tbl(Col) 

drop table #tmp_xml 

和xml:

<data_exchange> 

<goods_item> 
<goods_level>1</goods_level> 
<goods_isgroup>1</goods_isgroup> 
<goods_code>51852</goods_code> 
<goods_name></goods_name> 
<goods_parent></goods_parent> 
<goods_art></goods_art> 
<goods_buhart></goods_buhart> 
<goods_inpack>0</goods_inpack> 
<goods_packtxt></goods_packtxt> 
<goods_country></goods_country> 
<goods_gtd></goods_gtd> 
<goods_nds>0</goods_nds> 
<goods_unit></goods_unit> 
</goods_item> 

<goods_item> 
<goods_level>1</goods_level> 
<goods_isgroup>1</goods_isgroup> 
<goods_code>51852</goods_code> 
<goods_name></goods_name> 
<goods_parent></goods_parent> 
<goods_art></goods_art> 
<goods_buhart></goods_buhart> 
<goods_inpack>0</goods_inpack> 
<goods_packtxt></goods_packtxt> 
<goods_country></goods_country> 
<goods_gtd></goods_gtd> 
<goods_nds>0</goods_nds> 
<goods_unit></goods_unit> 
</goods_item> 

<goods_item> 
<goods_level>1</goods_level> 
<goods_isgroup>1</goods_isgroup> 
<goods_code>51852</goods_code> 
<goods_name></goods_name> 
<goods_parent></goods_parent> 
<goods_art></goods_art> 
<goods_buhart></goods_buhart> 
<goods_inpack>0</goods_inpack> 
<goods_packtxt></goods_packtxt> 
<goods_country></goods_country> 
<goods_gtd></goods_gtd> 
<goods_nds>0</goods_nds> 
<goods_unit></goods_unit> 
</goods_item> 

</data_exchange> 

這是我在SQL的第一個項目,也許我是愚蠢的:)

+0

如果我測試它,你的查詢工作正常。你能詳細說明一下嗎「但是否則有錯誤。」 ? – Andomar 2012-08-17 11:46:27

+0

錯誤是「無效的對象名稱'dbo.XML_import'。」。但是我的數據庫中有正確的字段。 – 2012-08-17 12:09:32

+0

哈哈,這就像完全不相關的XML的東西:)嘗試完全限定表的名稱,如「insert into dbname.schemaname.tablename」? – Andomar 2012-08-17 13:39:51

回答

1

如果我是你,我會將代碼更改爲: Cheers

Declare @Xml Xml 

Select @Xml = Convert(Xml, bulkcolumn) 
    From OpenRowSet (
     Bulk N'D:\Tests\price1.xml' 
    , Single_Blob 
    ); 

If (
    Object_Id('XML_import') Is Null 
) Select Tbl.Col.value('goods_level[1]',  'Int') 
    , Tbl.Col.value('goods_isgroup[1]', 'NVARCHAR(50)') 
    , Tbl.Col.value('goods_code[1]',  'NVARCHAR(50)') 
    , Tbl.Col.value('goods_name[1]',  'NVARCHAR(50)') 
    , Tbl.Col.value('goods_parent[1]', 'NVARCHAR(50)') 
    , Tbl.Col.value('goods_art[1]',  'NVARCHAR(50)') 
    , Tbl.Col.value('goods_buhart[1]', 'NVARCHAR(50)') 
    , Tbl.Col.value('goods_inpack[1]', 'NVARCHAR(50)') 
    , Tbl.Col.value('goods_packtxt[1]', 'NVARCHAR(50)') 
    , Tbl.Col.value('goods_country[1]', 'NVARCHAR(50)') 
    , Tbl.Col.value('goods_gtd[1]',  'NVARCHAR(50)') 
    , Tbl.Col.value('goods_nds[1]',  'NVARCHAR(50)') 
    , Tbl.Col.value('goods_unit[1]',  'NVARCHAR(50)') 
     Into XML_import 
     From @Xml.nodes('//goods_item') Tbl(Col) 
Else Insert XML_import 
     Select Tbl.Col.value('goods_level[1]',  'Int') 
     , Tbl.Col.value('goods_isgroup[1]', 'NVARCHAR(50)') 
     , Tbl.Col.value('goods_code[1]',  'NVARCHAR(50)') 
     , Tbl.Col.value('goods_name[1]',  'NVARCHAR(50)') 
     , Tbl.Col.value('goods_parent[1]', 'NVARCHAR(50)') 
     , Tbl.Col.value('goods_art[1]',  'NVARCHAR(50)') 
     , Tbl.Col.value('goods_buhart[1]', 'NVARCHAR(50)') 
     , Tbl.Col.value('goods_inpack[1]', 'NVARCHAR(50)') 
     , Tbl.Col.value('goods_packtxt[1]', 'NVARCHAR(50)') 
     , Tbl.Col.value('goods_country[1]', 'NVARCHAR(50)') 
     , Tbl.Col.value('goods_gtd[1]',  'NVARCHAR(50)') 
     , Tbl.Col.value('goods_nds[1]',  'NVARCHAR(50)') 
     , Tbl.Col.value('goods_unit[1]',  'NVARCHAR(50)') 
      From @Xml.nodes('//goods_item') Tbl(Col)