【SQL】数据迁移(跨数据库)

系列文章

【SQL】如何查询表字段并识别主键

本文链接:https://blog.csdn.net/youcheng_ge/article/details/110820405

【SQL】outer apply的用法
本文链接:https://blog.csdn.net/youcheng_ge/article/details/79903489

【SQL】多表连接重复数据处理
本文链接:https://blog.csdn.net/youcheng_ge/article/details/79903619


目录

系列文章

前言

一、技术介绍

二、测试用例

三、项目样例


前言

本专栏为【数据库】,主要介绍SQL的功能与特点、SQL数据定义语言(表、视图、索引、约束)、SQL数据操作语言(数据检索、数据插入、数据删除、数据更新)、创建与删除触发器、SQL数据控制语言(安全性和授权、事务处理)以及嵌入式SQL。
如果你对本专辑感兴趣,持续关注吧。大家有任何问题,也可以评论区反馈,私信我。

ef45ddb76e954ee5ac1791bb212495ea.jpg

一、技术介绍

opendatasource

二、测试用例

1、导入主表数据

--1、导入主表数据

insert into T502_standard_card_master

(standard_card_no

,[standard_name]

,[use_tag]

,[create_date]

,[standard_type]

)



select 

standard_card_no

,standard_name

,use_tag

,create_date

,standard_type

from T501_standard_card_code

2、导入明细数据(导入最新记录)

--2、导入明细数据(导入最新记录)

insert into T502_standard_card_detail

([standard_card_no]

,[standard_version]

,[card_state]

,[create_date]

,[release_date]

,[content_guid]

,[audit_tag]

,[countersign_tag]

,[create_work_no]

,[audit_work_no]

,[standard_note]

,[new_tag]

)



SELECT main.[standard_card_no]

,main.[standard_version]

,[card_state]

,[create_date]

,[release_date]

,[content_guid]

,[audit_tag]

,[countersign_tag]

,[create_work_no]

,[ratify_work_no]

,[standard_note]

,case when detail.standard_card_no>'' then 'T'

      else 'F' end as new_tag--最新记录标识



FROM [T501_standard_card_detail] main

left join 

(

SELECT max(scd.standard_card_no) as standard_card_no --单号

,max(scd.standard_version) as standard_version --版本号

FROM [T501_standard_card_detail] scd

group by scd.standard_card_no

)detail  on detail.standard_card_no=main.standard_card_no and detail.standard_version=main.standard_version

3、导入适用部门表

--3、导入适用部门表

--delete T502_execute_dept

insert into T502_execute_dept

 ([standard_card_no]

,[standard_version]

,[dept_no]

)



SELECT [standard_card_no]

,[standard_version]

,[dept_no]

FROM [T501_execute_dept]

4、导入错误实例表

--4、导入错误实例表

--delete T502_Error_example

insert into T502_Error_example

([standard_card_no]

,[standard_version]

,[feedback_no]

,[anlys_customer_guid]

,[proc_customer_guid]

,[improve_customer_guid]

,[project_no]

,[use_feedback_tag]

,[improve_memo_guid]

,[proc_memo_guid]

,[create_date]

)



SELECT  [standard_card_no]

,[standard_version]

,[feedback_no]

,[anlys_customer_guid]

,[proc_customer_guid]

,[improve_customer_guid]

,[project_no]

,[use_feedback_tag]

,[improve_memo_guid]

,[proc_memo_guid]

,[create_date]

FROM [T501_Error_example]

 5、导入排查关键字(跨数据库平台导入)

--5、导入排查关键字(跨数据库平台导入)

--delete T502_obj_key

insert into opendatasource('sqloledb','Data Source=202.101.102.***;User id=**;Password=***').wsbase923.dbo.T502_obj_key

([standard_card_no]

,[check_key]

,[except_key]

,[check_sn]

)



SELECT main.standard_card_no

,[check_key]--关键字(包含)

,'' as except_key--关键字(剔除)

,[check_sn]

FROM T501_standard_card_code main

inner join 

OPENDATASOURCE('sqloledb','Data Source=202.101.102.***;User id=***;Password=***').wsbase923.[dbo].[T_code_scan_obj_key] obj_key

on obj_key.check_type_no=main.standard_card_no

--6、导入排查范围(项目类型)(跨数据库平台导入)

--delete T502_scan_range_for_project 

--旧系统未上该模块,暂不能操作

--7、导入排查范围(组件)(跨数据库平台导入)

--delete T502_scan_range_for_assembly 

--旧系统未上该模块,暂不能操作

三、项目样例

insert into opendatasource('sqloledb','Data Source=202.101.103.224;User id=sa;Password=system').wsbase921.dbo.T401_taskplan_layout_master
([task_no]
,[sys_year]
,[sys_week]
,[project_type]
,[project_no]
,[task_type]
,[task_desc]
,[workload_pg]
,[change_type]
,[plan_start_datetime]
,[plan_end_datetime]
,[product_manager_worker_no]
,[dev_sn]
,[track_state_type]
,[feedback_no]
,[task_tag]
,[input_worker_no]
,[input_datetime]
,[confirm_tag]
,[confirm_worker_no]
,[confirm_datetime]
,[task_note]
,[state_type]
,[day1_tag]
,[day2_tag]
,[day3_tag]
,[day4_tag]
,[day5_tag]
,[dev_worker_type]
,[audit_tag]
,[abnormal_type]
,[project_code])

select [task_no]
,[sys_year]
,[sys_week]
,[project_type]
,[project_no]
,[task_type]
,[task_desc]
,[workload_pg]
,[change_type]
,[plan_start_datetime]
,[plan_end_datetime]
,[product_manager_worker_no]
,[dev_sn]
,[track_state_type]
,[feedback_no]
,[task_tag]
,[input_worker_no]
,[input_datetime]
,[confirm_tag]
,[confirm_worker_no]
,[confirm_datetime]
,[task_note]
,[state_type]
,[day1_tag]
,[day2_tag]
,[day3_tag]
,[day4_tag]
,[day5_tag]
,[dev_worker_type]
,[audit_tag]
,[abnormal_type]
,[project_code] 
from T401_taskplan_layout_master main
where  not exists
(
select top 1 1 
from opendatasource('sqloledb','Data Source=202.101.103.224;User id=sa;Password=system').wsbase921.dbo.T401_taskplan_layout_master d
where d.task_no = main.task_no
)

/** * 源数据库库连接池配置 * */ ConnPoolConfig config = new ConnPoolConfig(); config.setMaxPoolSize(30); config.setInitialPoolSize(20); config.setUrl("jdbc:sqlserver://192.168.0.222;databaseName=ciems"); config.setDriverClass("com.microsoft.sqlserver.jdbc.SQLServerDriver"); config.setUsername("sa"); config.setPassword("Password2017"); /** * 源库 * "queryDB" DBManager的自定义名称 * config 连接池配置 */ DBManager queryDb = new DBManager("queryDB",config); /** * 目标数据库连接池配置 * */ ConnPoolConfig tarconfig = new ConnPoolConfig(); tarconfig.setMaxPoolSize(30); tarconfig.setInitialPoolSize(20); tarconfig.setDriverClass("com.mysql.jdbc.Driver"); tarconfig.setUrl("jdbc:mysql://localhost:3306/datatransfer?useUnicode=true&characterEncoding=UTF8&useSSL=true"); tarconfig.setPassword("accp"); tarconfig.setUsername("root"); /** * 目标库 */ DBManager insertDb = new DBManager("insertDB",config); /** *做数据导入处理时的接口 * */ InsertHandler handler = new DBInsertHandlerImpl("t_big_data",null,insertDb); /** * 迁移任务的配置,配置关键信息项 */ ApplicationConfig apConfig = new ApplicationConfig("t_big_data"); apConfig.setQueryThreadNum(8); //指定查询线程数量,不指定默认为8 apConfig.setDataNum(5000); //设置每次从源库中抽取的数量 不指定默认为5000 /** * 源表的匹配条件 * 如果希望源表中符合条件的才迁移,请配置此项,禁止加where,请按照以下格式 */ apConfig.setConditionSql("0=0"); /** * 入库方式 * ** * 增量入库 ZLRK, (暂未实现) * 追加入库 ZJRK, (目标库有源表结构的基础上,增加源表的所有数据到目标库中) * 刷新入库 SXRK, (删除目标库的源表结构,自动创建并导入数据) * 更新入库 GXRK (暂未实现) * ** */ apConfig.setInsertType(InsertType.SXRK); /** * 日志线程,开启时可更直观的从标准输出流里观察到运行状态,不指定默认关闭 */ apConfig.setOpenLogThread(true); /** * 生命周期接口,线程不完全 * 分别有以下几个生命周期方法 * createTableDone() 目标库被创建表结构时调用一次 * queryDone(boolean result, int start, int end, long time,Throwable e) * 有数据从源表中查询到数据时被调用,直到任务完成 * result 查询结果 * start 查询起始行 * end 查询结束行 * time 共耗时 单位:ms * e 查询失败时抛出的异常 * insertDone(boolean result, int num, int errorNum, long time,Throwable e) * 有数据导入到目的库时被调用,直到任务完成 * result 导入结果 * num 导入总数量 * errorNum异常数量 * e 导入失败时抛出的异常 * taskDone(int all, int doneNum, int errorNum, long time,List errorRows, List e) * 任务完成时被调用 * all 任务总数据量 * doneNum 已完成的数据量 * errorNum异常的数据量 * time 总耗时 * errorRows异常的行记录 * e 所有的异常 */ TaskRunLog runLog = new TaskRunLogImpl(); /*** * 任务迁移核心类 * 以下是构造方式之一 * ApplicationConfig apConfig:任务关键配置 * DBManager queryDb: 源库 * InsertHandler handler:导入处理器 */ DataThransferApplication app = new DataThransferApplication(apConfig,queryDb,handler,runLog); /** * 初始化任务 */ app.init(); /** * 任务开始 */ app.start();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

花北城

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值