【问题标题】:Pass through XML to SQL通过 XML 传递给 SQL
【发布时间】:2012-08-13 20:39:17
【问题描述】:

我需要解析我的 XML 文件并将解析的 XML 保存到 SQL 数据库。我的 XML 包含几个标签 <goods_item>。如果它只包含一个标签,它工作正常。但其他地方也有错误。

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 项目,也许我很笨 :)

【问题讨论】:

  • 如果我测试它,您的查询可以正常工作。您能否详细说明“但其他方面存在错误”。 ?
  • 错误是“无效的对象名称'dbo.XML_import'。”。但是我的数据库中有一个表格,里面有正确的字段。
  • 哈哈,这与 XML 的东西完全无关 :) 尝试完全限定表名,例如 insert into dbname.schemaname.tablename ?
  • 我试过了,还是一样的错误。
  • 您运行查询的帐户是否拥有该表的insert 权限?

标签: sql xml database import


【解决方案1】:

如果我是你,我会将代码更改为: 干杯

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-20
    • 2022-11-12
    • 2012-08-29
    • 2019-08-15
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多