微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将XML数据批量插入SQL Server 2005数据库的最佳方法

我必须将大约25-30个 XML分解为我的sql Server 2005数据库(总大小约为10 MB).一旦将新的xml文件复制到服务器,我就需要这个逻辑自动运行.

我已阅读本网站和其他网站上的很多帖子,但仍不能总结我必须使用什么来粉碎数据.

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

> sqlBulk复制
> C#反序列化
> 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>

谢谢.

鉴于您在sql变量中拥有XML,您可以使用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]',ListingAgentName = EstL.value('(listingAgent/name)[1]','varchar(50)'),ListingAgentTel = EstL.value('(listingAgent/telephone)[1]',ListingAgentEMail = EstL.value('(listingAgent/email)[1]','varchar(250)'),[Description] = EstL.value('(description)[1]',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变量,解析它,将数据插入表等)对磁盘上的任意数量的XML文件运行.

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

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

等等….

更新:这里的查询提取UniqueID并且每个完整的< img>标记来自该XML输入的信息并显示它(或将其插入另一个表中):

SELECT
    UniqueID = @input.value('(/estateList/uniqueID)[1]',ImageID = Images.value('(img/@id)[1]',ImageModTime = Images.value('(img/@modTime)[1]',ImageFormat = Images.value('(img/@format)[1]',ImageURL = Images.value('(img/@url)[1]','varchar(250)')
FROM 
    @input.nodes('/estateList/address/ImagesContainer') AS Tbl(Images)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。