5

我必须将大约 25 - 30 个 XML 切碎到我的 SQL Server 2005 数据库中(总大小约为 10 MB)。我需要这个逻辑在新的 xml 文件复制到服务器后自动运行。

我已经阅读了该站点和其他站点上的许多帖子,但仍然无法就我必须使用什么来分解数据做出结论。

请让我知道我应该选择哪个选项

  1. SqlBulk 复制
  2. C# 反序列化
  3. SSIS

我必须为我的数据模型创建 C# 类。所以 C# 反序列化是我的首选。但请让我知道从性能角度来看哪个选项是正确的。

我忘记提到的另一件事是 XML 文件的结构会有所不同。它不会是一样的。我将拥有包含所有可能填充的列的表。但是 xmls 不会始终拥有所有数据。

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,将每个 XML 加载到 SQL 变量中,解析它,将数据插入表等)

但是:具有挑战性的部分将是以下问题:

  • 可以有多个上市代理吗?如果是的话:如何处理?
  • 可以有多个电话号码以及如何处理?
  • 如何处理每个地址的多个图像

等等....

更新:这里的查询将从该 XML 输入中提取UniqueID每个完整<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 回答