0

私はこのタスクを実行するためのプログラムを1週間研究し、作成/書き直しています。今まで思いもよらなかったものを生み出すために、これについてのコラボレーションが必要です。具体的には、自動生成されたXMLファイルが毎日最大70kレコード(最大75MBのサイズ)で送信されます。クエリできるように、この情報を含むサーバー(SQL)の1つにテーブルを作成するように依頼されました。また、このプログラムは、既存のレコードを更新し(データが変更されている場合)、新しいレコードを毎日挿入する必要があります。レコードをデータベースから削除してはなりません

これが私が(これまでに)試みた方法とそれらが機能しなかった理由のリストです。

  1. SQLXMLBulkLoad-これはデータのインポートに最適です。ただし、Bulk Loadクラスの制限は、更新や挿入ができないことです。書き直しの時間です。

  2. SQL OpenRowSet(SQLCommandなどを使用)-サーバー、プログラム、およびXMLファイルが3つすべて異なるコンピューター上にあるため、これは機能しません。これらのデバイスは、ファイル(特にサーバー)への相互アクセスを許可するように構成できますが、この方法は「現実的ではなく、オーバーヘッドが大きすぎる」と見なされました。再書き込みの時間。

  3. DataSet Merge、次にTableAdapter.Update-このメソッドは、最初は確実に機能するように見えました。考え方は単純です。DataSet.XMLRead()メソッドを使用してXMLデータをデータセット内のテーブルに配置し、SQLテーブルをデータセットに追加し(SQLCommandなどを使用)、2つのテーブルをマージしてから、Tableを使用します。テーブルを更新/既存のSQLテーブルに挿入するためのアダプタ。XMLファイルには日付を含む2つのノード(列)があるため、この方法は機能しないようです。残念ながら、SQLとXMLの間には統一されたDateデータ型はありません。すべての日付形式をXMLファイルからDateTimeSQL形式に変更しようとしましたが、これは機能しましたが、実行時にデータ型の不一致の例外と見なされました。

この時点で、私はアイデアがありません。これは確かに以前に行われた作業のようです。私は必ずしも私のためにこのコードを書く誰かを探しているわけではありません(私はこれを完全に行うことができます)、私はこのトピックに関するいくつかのコラボレーションが必要です。

ありがとうございました

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 に答える