如何解决数据库转换后的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<>0 and fkeycount=1
将查询的结果到sql server库执行。需要注意的是,这里面需要建立sql server到oracle的链接服务器,本实例中ORC为链接服务器的名称(关于如何建立sql server到oracle的链接服务器可以参考另一个帖子:
https://wenku.my7c.com/article/243415848155361536
--DROP TABLE chl_tablerecord create table chl_tablerecord(ftablename varchar(300),fcount int,fcolumn_count int,fkeycount int); insert into chl_tablerecord(ftablename,fcolumn_count) select a.table_name,b.fcount from user_tables a join (select table_name,count(1) fcount from user_tab_cols group by table_name) b on a.table_name=b.table_name where a.table_name not like 'TMP%' and a.table_name not like 'TM%' and a.table_name not like 'MLOG%' and a.table_name not like '%$%' and a.table_name not in ( select object_name from user_objects where object_type='MATERIALIZED VIEW' ); update chl_tablerecord set fkeycount=0; merge into chl_tablerecord 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.ftablename=b.table_name ) when matched then update set a.fkeycount=b.fcount; COMMIT; / --统计数据量 declare var_ftablename varchar2(300); cursor chl_cur is select ftablename from chl_tablerecord; begin open chl_cur; fetch chl_cur into var_ftablename; while chl_cur%found loop --使用游标属性 execute immediate 'update chl_tablerecord set fcount=(select count(1) from '||var_ftablename||') where ftablename='''||var_ftablename||'''' ; fetch chl_cur into var_ftablename; end loop; close chl_cur; end; / COMMIT;
如何解决数据库转换后的xml空值问题
本文2024-09-16 18:39:02发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-23508.html
- 鼎捷EAI整合規範文件V3.1.07 (集團).pdf
- 鼎捷OpenAPI應用場景說明_基礎資料.pdf
- 鼎捷OpenAPI應用場景說明_財務管理.pdf
- 鼎捷T100 API設計器使用手冊T100 APIDesigner(V1.0).docx
- 鼎新e-GoB2雲端ERP B2 線上課程E6-2應付票據整批郵寄 領取.pdf
- 鼎新e-GoB2雲端ERP B2 線上課程A4使用者建立權限設定.pdf
- 鼎新e-GoB2雲端ERP B2 線上課程C3會計開帳與會計傳票.pdf
- 鼎新e-GoB2雲端ERP B2 線上課程E6-1應付票據.pdf
- 鼎新e-GoB2雲端ERP B2 線上課程A5-1進銷存參數設定(初階篇).pdf
- 鼎新e-GoB2雲端ERP B2 線上課程D2帳款開帳與票據開帳.pdf