SQL读取XML字段


最近要对一套老系统进行数据迁移,这样苦逼的工作就来了,需要新旧两套系统数据表字段进行对比,最终将老系统的数据迁移到新系统中来。

尽管数据结构不一致、部分字段不一致,也只是恶心一点麻烦一点,勉勉强强速度慢点,还是可以整理出来,并编写好迁移的SQL语句。


一步一步走了好几步了,出来个更恶心的怪物了!强大的XML数据字段


本来应该是单独存到一个子表的信息,在老系统中硬生生的存到了一个XML字段中


    
    
在数据迁移的时候,必须要把这些数据,转移到一个子表中,那么我需要可以对XML进行读取,如下:

ID	NAME
1	TOM
1	JIM


开动大脑想想,怎么破呢?

分两步走吧,第一步,首选实现针对单独一条数据的XML信息实现读取,然后再实现多条数据的XML读取,当然能读出来,也就可以再插入了,O(∩_∩)O哈哈~


1.实现单独一条数据XML的读取

DECLARE @XML XML
SELECT @XML=
'
    
    
'

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的方式,我这里只使用了很小的一部分,大家想学习更新,看原文收获也会很大的!

你可能感兴趣的:(SQL,Server,sql,xml)