SQL读取XML字段
最近要对一套老系统进行数据迁移,这样苦逼的工作就来了,需要新旧两套系统数据表字段进行对比,最终将老系统的数据迁移到新系统中来。
尽管数据结构不一致、部分字段不一致,也只是恶心一点麻烦一点,勉勉强强速度慢点,还是可以整理出来,并编写好迁移的SQL语句。
一步一步走了好几步了,出来个更恶心的怪物了!强大的XML数据字段
本来应该是单独存到一个子表的信息,在老系统中硬生生的存到了一个XML字段中
<root> <people id=1 name=tom/> <people id=2 name=jim/> </root>在数据迁移的时候,必须要把这些数据,转移到一个子表中,那么我需要可以对XML进行读取,如下:
ID NAME 1 TOM 1 JIM
开动大脑想想,怎么破呢?
分两步走吧,第一步,首选实现针对单独一条数据的XML信息实现读取,然后再实现多条数据的XML读取,当然能读出来,也就可以再插入了,O(∩_∩)O哈哈~
1.实现单独一条数据XML的读取
DECLARE @XML XML SELECT @XML= '<root> <people id="1" name="tom"/> <people id="2" name="jim"/> </root>' SELECT v.value('@id[1]','VARCHAR(20)') AS ID, v.value('@name[1]','VARCHAR(20)') AS Name FROM @XML.nodes('/root/people') x(v)
2.实现多条数据XML的读取
由于每一条XML数据都可能有多条数据,在这里,我使用了游标,每次遍历一条数据,读取XML,然后针对该条数据的自数据进行数据插入更新
DECLARE @ID VARCHAR(36) DECLARE @XML XML DECLARE CUR CURSOR FOR SELECT id FROM testTable FOR READ ONLY OPEN CUR; FETCH NEXT FROM CUR INTO @ID WHILE @@FETCH_STATUS=0 BEGIN SELECT @XML=xmlField FROM testTable WHERE id=@ID SELECT v.value('@id[1]','VARCHAR(20)') AS ID, v.value('@name[1]','VARCHAR(20)') AS Name FROM @XML.nodes('/root/people') x(v) --根据该SQL修改为插入或者更新语句的SQL,可以将其括起来,作为一个虚表 FETCH NEXT FROM CUR INTO @ID END CLOSE CUR DEALLOCATE CUR
OK,问题到此搞定!
大家有什么好的办法,可以沟通交流。(第二步骤,我是一次性执行数据迁移使用,如果是常规经常性使用,那么是很不建议使用游标的!就需要一个更好的解决方法。。。
原文参考:http://www.cnblogs.com/l1pe1/archive/2010/07/28/1787254.html
里边好多各种读取、操作XML的方式,我这里只使用了很小的一部分,大家想学习更新,看原文收获也会很大的!
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。