我必须将大约25-30个XML分解到我的SQL Server 2005数据库中(总大小约为10 MB)。一旦将新的xml文件复制到服务器,我就需要这个逻辑自动运行。
我已阅读本网站和其他网站上的很多帖子,但仍无法总结我必须使用什么来粉碎数据。
请让我知道我应该选择哪个选项
我必须为我的数据模型创建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>
感谢。
答案 0 :(得分:4)
鉴于您在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]', '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变量,解析它,将数据插入表等)对磁盘上的任意数量的XML文件运行。
但是挑战性的部分将是:
等等....
更新:此查询此处将从该XML输入中提取UniqueID
和每个完整的<img>
标记的信息并显示它(或将其插入另一个表中):< / p>
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)