如何解决数据库转换后的xml空值问题

Oracle转sql server或者sql server不同版本之间的转换,可能会遇到转换前的xml空值转换后变成空字符串的情况。对于星空来说,空字符串的xml程序可能会因为读取不到数据而报错,因为二者是截然不同的。例如:

第一行为null值,第二行为空字符串
接下来在这里分享将空字符串的xml转换为null值xml的方案。直接暴力将目标数据库中的xml字段中的空字符串修改为null值,看似可以解决这个问题,但是也有可能矫枉过正——将原本应该是空字符串的字段修改为null值了。
下面以oracle转sql 为例来说明处理的过程:
1、创建表chl_havexml用来存储类型为xml类型的表名和字段(oracle数据库执行)
create table chl_havexml(table_name varchar2(100),column_name varchar2(100), fkeycount number,fkeyfield varchar2(100),fnullvaluecount number)
2、收集类型为xml类型的表名和字段(oracle数据库执行)
insert into chl_havexml(table_name,column_name,fkeycount,fkeyfield,fnullvaluecount) select table_name,column_name,0,'',0 from user_tab_cols where data_type='XMLTYPE'
3、统计一下这些xml字段所属表的主键数量(oracle库执行)
update chl_havexml set fkeycount=0; merge into chl_havexml a using (select t1.table_name,count(column_name) fcount from user_constraints t1 join user_cons_columns t2 on t1.constraint_name=t2.constraint_name where constraint_type ='P' group by t1.table_name) b on (a.table_name=b.table_name ) when matched then update set a.fkeycount=b.fcount;
4、收集单一主键的表的主键字段名(oracle库执行)
merge into chl_havexml a using (select t1.table_name,column_name from user_constraints t1 join user_cons_columns t2 on t1.constraint_name=t2.constraint_name where constraint_type ='P' and t1.table_name in (select table_name from chl_havexml where fkeycount=1) ) b on (a.table_name=b.table_name) when matched then update set a.fkeyfield=b.column_name
5、动态凭借统计控制数据量sql,将查询到的sql复制出来执行(oracle库执行)
select 'update chl_havexml set fnullvaluecount= (select count(1) from '||table_name||' where '||column_name||' is null) where table_name='''||table_name||''' and column_name='''||column_name||''';' from chl_have
6、查看这些待xml字段的表有多少个是存在空值数据的(oracle库执行)
select * from chl_havexml where fnullvaluecount<>0
7、查看存在空值数据的表不是单一主键的(oracle库执行)
select * from chl_havexml where fnullvaluecount<>0 and fkeycount<>1
视图的话可以不用处理,因为基表处理了视图自然也自动维护好了
像星空多语言表,有时候是两个主键,这些数据要单独处理了
8、查看存在空值数据的表是单一主键的(oracle库执行)
select * from T_MDL_FORMMENUTPL_L where fxml is null
9、编写批量更新的SQL(oracle库执行)
select 'update '||table_name||' set '||column_name||'=null where '||fkeyfield||' in (select '||fkeyfield||' from openquery(ORC,''select '||fkeyfield||' from '||table_name||' where '||column_name||' is null'')) and convert(varchar(max),'||column_name||')=''''; ' from chl_havexml where fnullvaluecount
如何解决数据库转换后的xml空值问题
Oracle转sql server或者sql server不同版本之间的转换,可能会遇到转换前的xml空值转换后变成空字符串的情况。对于星空来说,空字符串的x...
点击下载文档文档为doc格式
声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。
上一篇
已经是第一篇



