设为首页 加入收藏

TOP

SQL读取XML字段
2015-11-21 01:49:48 来源: 作者: 【 】 浏览:0
Tags: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,问题到此搞定!

大家有什么好的办法,可以沟通交流。(第二步骤,我是一次性执行数据迁移使用,如果是常规经常性使用,那么是很不建议使用游标的!就需要一个更好的解决方法。。。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇sql学习笔记(5)---------有关时.. 下一篇SQL获取数据库表信息

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: