5

SQL Server 2005データベースに約25〜30個のXMLを細断処理す​​る必要があります(合計サイズは約10 MBになります)。また、新しいxmlファイルがサーバーにコピーされるとすぐに、このロジックを自動的に実行する必要があります。

このサイトや他のサイトで多くの投稿を読みましたが、データを細断処理す​​るために何を使用する必要があるかについてはまだ結論を出すことができません。

plsは私にどのオプションを使うべきか教えてくれます

  1. SqlBulkコピー
  2. C#の逆シリアル化
  3. SSIS

データモデルのC#クラスを作成する必要があります。したがって、C#の逆シリアル化が私の最初の選択でした。しかし、plsは、パフォーマンスの観点からどのオプションが適切かを教えてくれます。

私が言及するのを忘れたもう一つのことは、XMLファイルの構造が変わるということでした。それは同じではないでしょう。おそらく入力される可能性のあるすべての列を含むテーブルがあります。ただし、xmlには常にすべてのデータが含まれているわけではありません。

xmlのサンプル

<?xml version="1.0" encoding="utf-8"?>
<estateList date="2012-08-06T12:17:05">
  <uniqueID>22XXln</uniqueID>
  <category name="Apartment" /> 
  <listingAgent>
     <name>DIW Office</name>  
     <telephone type="BH">96232 2345</telephone> 
     <telephone type="BH">9234 2399</telephone>
     <email>abcd@abc.com</email>    
  </listingAgent>
  <inspectionTimes /> 
  <description>AVAILABLE NOW. </description> 
  <price>0</price>  
  <address display="yes">      
    <street>Lachlsan Street</street>        
    <ImagesContainer>        
       <img id="m" modTime="2012-08-06-12:17:05" url="http://images/2409802.jpg" format="jpg" /> 
       <img id="a" modTime="2012-08-06-12:17:05" /> 
    </ImagesContainer>     
  </address>
</estateList>

ありがとう。

4

1 に答える 1

4

XMLがSQL変数に含まれている場合、SQL Server 2005で追加されたXQueryサポートを備えたストレートT-SQLを使用して、ほとんどの情報を非常に簡単に解析できます。

次のようなものを試してください:

DECLARE @Input XML = '<estateList date="2012-08-06T12:17:05">
  <uniqueID>22XXln</uniqueID>
  <category name="Apartment" /> 
  <listingAgent>
     <name>DIW Office</name>  
     <telephone type="BH">96232 2345</telephone> 
     <telephone type="BH">9234 2399</telephone>
     <email>abcd@abc.com</email>    
  </listingAgent>
  <inspectionTimes /> 
  <description>AVAILABLE NOW. </description> 
  <price>0</price>  
  <address display="yes">      
    <street>Lachlsan Street</street>        
    <ImagesContainer>        
       <img id="m" modTime="2012-08-06-12:17:05" url="http://images/2409802.jpg" format="jpg" /> 
       <img id="a" modTime="2012-08-06-12:17:05" /> 
    </ImagesContainer>     
  </address>
</estateList>'

SELECT
    EstateListDate = EstL.value('@date', 'datetime'),
    UniqueID = EstL.value('(uniqueID)[1]', 'varchar(20)'),
    Category = EstL.value('(category/@name)[1]', 'varchar(20)'),
    ListingAgentName = EstL.value('(listingAgent/name)[1]', 'varchar(50)'),
    ListingAgentTel = EstL.value('(listingAgent/telephone)[1]', 'varchar(50)'),
    ListingAgentEMail = EstL.value('(listingAgent/email)[1]', 'varchar(250)'),
    [Description] = EstL.value('(description)[1]', 'varchar(250)'),
    Price = EstL.value('(price)[1]', 'decimal(14,2)'),
    DisplayAddress = EstL.value('(address/@display)[1]', 'varchar(10)'),
    AddressStreet = EstL.value('(address/street)[1]', 'varchar(100)')
FROM @input.nodes('/estateList') AS Tbl(EstL)

そして、あなたは得るべきです:

ここに画像の説明を入力してください

このデータはテーブルに簡単に挿入できます。そして、このクエリは、かなり簡単なSSISパッケージを使用して、ディスク上の任意の数のXMLファイルに対して実行できます(XMLを列挙し、それぞれをSQL変数にロードし、解析し、データをテーブルに挿入します)。

しかし、難しい部分は次のような質問になります。

  • 複数のリスティングエージェントが存在できますか?そして、はいの場合:それをどのように処理するのですか?
  • 複数の電話番号があり、それに対処する方法はありますか?
  • アドレスごとに複数の画像をどうするか

など...。

更新:UniqueIDここでのこのクエリは、そのXML入力からおよび各完全なタグの情報を抽出して<img>表示します(または別のテーブルに挿入します)。

SELECT
    UniqueID = @input.value('(/estateList/uniqueID)[1]', 'varchar(20)'),
    ImageID = Images.value('(img/@id)[1]', 'varchar(20)'),
    ImageModTime = Images.value('(img/@modTime)[1]', 'varchar(50)'),
    ImageFormat = Images.value('(img/@format)[1]', 'varchar(20)'),
    ImageURL = Images.value('(img/@url)[1]', 'varchar(250)')
FROM 
    @input.nodes('/estateList/address/ImagesContainer') AS Tbl(Images)
于 2012-08-09T10:48:03.703 に答える