最近要对一套老系统进行数据迁移,这样苦逼的工作就来了,需要新旧两套系统数据表字段进行对比,最终将老系统的数据迁移到新系统中来。
尽管数据结构不一致、部分字段不一致,也只是恶心一点麻烦一点,勉勉强强速度慢点,还是可以整理出来,并编写好迁移的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的方式,我这里只使用了很小的一部分,大家想学习更新,看原文收获也会很大的!