0

一个星期以来,我一直在研究和编写/重写一个程序来完成这项任务。我需要在这方面进行一些合作,也许会提出一些我以前没有想到的东西。具体来说,我们每天都会向我们发送一个自动生成的 XML 文件,其中包含约 7 万条记录(大小约 75MB)。我被要求在其中一个服务器 (SQL) 上创建一个包含此信息的表,以便可以对其进行查询。此外,该程序必须更新现有记录(如果数据已更改)并每天插入新记录。不得从数据库中删除记录

这是我尝试过的方法列表(到目前为止)以及它们不起作用的原因。

  1. SQLXMLBulkLoad - 这非常适合导入数据。但是,批量加载类的限制是它不能更新和/或插入。是时候重写了。

  2. SQL OpenRowSet(使用 SQLCommand 等) - 这不起作用,因为服务器、程序和 XML 文件都将 3 位于不同的计算机上。这些设备可以配置为允许彼此访问文件(特别是服务器),但是这种方法被认为“不现实,开销太大”需要重新写入。

  3. DataSet Merge,然后是 TableAdapter.Update - 这个方法最初看起来肯定会起作用。思路很简单,使用DataSet.XMLRead()方法将XML数据放入数据集中的一个表中,然后只需将SQL表添加到数据集中(使用SQLCommand等),合并两个表,然后使用Table将表更新/插入到现有 SQL 表中的适配器。此方法似乎不起作用,因为 XML 文件有两个包含日期的节点(列)。不幸的是,SQL 和 XML 之间没有统一的 Date 数据类型。我什至尝试将 XML 文件中的所有日期格式更改为 DateTime SQL 格式,该格式有效,但在运行时仍被视为数据类型不匹配异常。

在这一点上,我没有想法。这似乎是以前肯定做过的任务。我不一定要找人为我编写这段代码(我完全有能力),我只需要在这个主题上进行一些合作。

谢谢你

4

1 回答 1

1

我们对以 XML 格式接收的数据库导入做类似的事情,我所做的只是将 XML 直接传递给存储过程,然后使用 XQuery 和 OPENXML 分解 XML。

这两种技术都允许您在 SQL 中查询 XML,就好像它是数据库中的一个表一样。采用这种方法,您只需将 XML 传递给脚本或存储过程,在 SQL 中对其进行查询,然后将结果插入到您需要的任何位置。有趣的是,OPENXML 更适合处理大型 XML 文件,但您可以同时尝试这两种方法,看看它们是如何为您工作的。下面是一个使用 OPENXML 和一个简单的合并语句的示例。

create procedure ImportXml
(
    @importXml xml
)
as
--with OPENXML you have to prepare the document before you use it
--this is unecessary with XQuery
DECLARE @idoc int
EXEC sp_xml_preparedocument @idoc OUTPUT, @importXml;

--this is just a typical Merge statement that will update data if it exists
--and insert it if it does not
merge NormalDataTable
using
(
     --here is where you are querying the XML document directly.  You can 
     --see, it works just like a SQL statement, with a special syntax for
     --specifying where to get data out of the XML document and how to map
     --it to a table structure
     select *
     from openxml(@idoc, '/Root/Element')
     with
     (
         ElementID int '@ElementID',
         ElementValueName varchar(50) '@ElementValueName'
     ) 
) source
on NormalDataTable.ElementID = source.ElementID
when not matched then
    insert ...
when matched then
    update ...

exec sp_xml_removedocument @idoc
于 2012-07-23T20:24:57.193 回答