数据库端数据转移

工作中遇到需要实现不同版本的数据库间,数据同步。当然了前提数据表接口相同。有了2个多小时时间写了一个支持批量多张数据表进行有条件的数据转移.不受标识列的限制。如有不周之处还请大家积极批评指正。

----------***************************************************************************************

if exists (select * from dbo.sysobjects where id = object_id(N‘[dbo].proc_TransferDateFormSourceToGoal‘) and OBJECTPROPERTY(id, N‘IsProcedure‘) = 1)
-- 删除存储过程
drop procedure [dbo].proc_TransferDateFormSourceToGoal
GO
-- 支持批量多张数据表进行有条件的数据转移.不受标识列的限制
create proc proc_TransferDateFormSourceToGoal
(
	@sourceTableNames nvarchar(2000),  --数据源数据表,多表以逗号隔开,最后以逗号结尾 如 ‘T_meterInformation,T_basicInfo,‘
	@sourceParameters nvarchar(2000), --数据源数据表对应的条件,表以逗号隔开,最后以逗号结尾.无条件为空逗号如‘1=1,,‘
	@sourceDataBaseName	 nvarchar(2000),--数据源数据库名称
	@goalTableNames nvarchar(2000),--目标数据源数据表,多表以逗号隔开,最后以逗号结尾 如 ‘T_meterInformation,T_basicInfo,‘
	@sourceIPAndProt	nvarchar(100),--数据源ip地址和端口号,默认1433可以不用拼写端口号。如‘192.168.12.60:1433‘(‘192.168.12.60‘)
	@sourceUserName nvarchar(200),--数据源登陆账户名
	@sourcePassWord nvarchar(200)--数据源登陆密码
)
as
	set nocount on

	declare @ErrorCount int
	set @ErrorCount=0
	begin --main proc
		declare @loginName nvarchar(20)
		set @loginName=‘srv_lnk‘
		exec   sp_addlinkedserver     @loginName, ‘ ‘, ‘SQLOLEDB ‘, @sourceIPAndProt
		exec   sp_addlinkedsrvlogin   @loginName, ‘false ‘,null,@sourceUserName, @sourcePassWord

		declare @OperatedTableList	 table
		(
			tableName nvarchar(200),
			parameterStr nvarchar(200),
			goalTableName nvarchar(200)
		)

		declare @tableNameTemp nvarchar(200),@parameterStr nvarchar(200),@goalTableNameTemp nvarchar(200)
		set	 @tableNameTemp=‘‘
		set	@parameterStr=‘‘
		set	@goalTableNameTemp=‘‘
		while LEN(@sourceTableNames)>0
		begin
			--处理数据表列表
			set @tableNameTemp=LEFT(@sourceTableNames,charindex(‘,‘,@sourceTableNames)-1)
			set @sourceTableNames=SUBSTRING(@sourceTableNames,len(@tableNameTemp)+2,LEN(@sourceTableNames))
			--处理数据表列表
			set @parameterStr=LEFT(@sourceParameters,charindex(‘,‘,@sourceParameters)-1)
			set @sourceParameters=SUBSTRING(@sourceParameters,len(@parameterStr)+2,LEN(@sourceParameters))
			--Test
			--select @tableNameTemp,@tableNames,@parameterStr,@parameters

			set @goalTableNameTemp=LEFT(@goalTableNames,charindex(‘,‘,@goalTableNames)-1)
			set @sourceParameters=SUBSTRING(@goalTableNames,len(@goalTableNameTemp)+2,LEN(@goalTableNames))

			insert into @OperatedTableList
			select @tableNameTemp,@parameterStr,@goalTableNameTemp

			set	 @tableNameTemp=‘‘
			set	@parameterStr=‘‘
			set	@goalTableNameTemp=‘‘
		end

		begin --循环遍历 操作数据 
			declare	 Temp_Cursor cursor for
			select tableName,parameterStr,goalTableName from @OperatedTableList

			declare @ParameterStrTemp nvarchar(200)

			Set	 @ParameterStrTemp=‘‘
			set	@tableNameTemp=‘‘
			set	@goalTableNameTemp=‘‘

			open Temp_Cursor
			fetch next from Temp_Cursor into @tableNameTemp,@ParameterStrTemp,@goalTableNameTemp
			while @@FETCH_STATUS=0
			begin
				if	 LEN(@ParameterStrTemp)<>0
				begin
					set @ParameterStrTemp=‘where ‘[email protected]
				end

				declare @columns nvarchar(500)
				set @columns=‘‘

				SELECT   @columns=isnull(@columns+‘,‘,‘‘) +a.name FROM    syscolumns a  inner join    sysobjects d
				on
					a.id=d.id  and d.xtype=‘U‘ and  d.name<>‘dtproperties‘
				where
					[email protected]
				   
				 set @columns=RIGHT(@columns,LEN(@columns)-1) 

				exec 	(
				‘

				 begin tran
				if exists (select * from ‘[email protected]+‘.‘[email protected]+‘.dbo.sysobjects where name=‘‘‘[email protected]+‘‘‘ ) and 		exists (select * from dbo.sysobjects where id = object_id(N‘‘dbo.‘[email protected]+‘‘‘) and OBJECTPROPERTY(id, N‘‘IsUserTable‘‘) = 1) and exists(select   *   from   syscolumns   where   id=object_id(N‘‘‘[email protected]+‘‘‘)    and   COLUMNPROPERTY(id,name,‘‘IsIdentity‘‘)=1)
				begin

						SET IDENTITY_INSERT ‘[email protected]+‘ ON
						insert into ‘[email protected]+‘(‘[email protected]+‘)
						select * from ‘[email protected]+‘.‘[email protected]+‘.dbo.‘[email protected]+‘ ‘[email protected]+‘
						SET IDENTITY_INSERT ‘[email protected]+‘ OFF

				end
				else if 
					 exists (select * from ‘[email protected]+‘.‘[email protected]+‘.dbo.sysobjects where name = ‘‘‘[email protected]+‘‘‘ ) and 		exists (select * from dbo.sysobjects where id = object_id(N‘‘dbo.‘[email protected]+‘‘‘) and OBJECTPROPERTY(id, N‘‘IsUserTable‘‘) = 1) 
				begin
					insert into ‘[email protected]+‘(‘[email protected]+‘)
					select *  from ‘[email protected]+‘.‘[email protected]+‘.dbo.‘[email protected]+‘ ‘[email protected]+‘
				end
				if @@error>0
				rollback tran
				else
				commit tran
				‘)
				set @[email protected][email protected]@ERROR
				fetch next from Temp_Cursor into @tableNameTemp,@ParameterStrTemp,@goalTableNameTemp
			end
			close Temp_Cursor
			deallocate Temp_Cursor
		end

	end
	   exec sp_dropserver   @loginName, ‘droplogins ‘  
	set nocount off
go

             

--测试语句
--exec proc_TransferDateFormSourceToGoal  ‘T_HouseDetailD,‘,‘,‘,‘db_meterReadingData‘,‘T_HouseDetailD,‘,‘221.204.238.48‘,‘sa‘,‘huizhong‘

--初步测试结果:单表无条件插入百万级数据实际耗时在30分钟内,这个跟网络条件有一定因素。以后导数据终于不用发愁了。嘎嘎!!!!!!!!

数据库端数据转移,布布扣,bubuko.com

时间: 2025-01-24 21:32:35

数据库端数据转移的相关文章

运用Navicat for MySQL进行MSSQL数据转移MYSQL

当前不同数据库进行数据转移已经不是一件麻烦事情,特别是有很多很方便的工具,而最近我在搜集各种数据时候,也需要进行大量的数据转移,并且数据库和所转移的数据库表都不同,这次给大家介绍个最简单的方法,就是使用Navicat for MySQL从SQL server中转移数据到MYSQL中 1.需要进行转移的mssql数据库数据 2.打开Navicat for MySQL软件,并连接到自己的MYSQL数据库选择对应的数据库表,然后点击软件图片所示的 导入 按钮,选择最后一项 3.按照流程,点击指示按钮,

案例分享:数据库镜像故障转移失败

案例分享:数据库镜像故障转移失败 对于关键性数据库,我们配置了带有见证服务器的同步数据库镜像,来允许自动故障转移.一切运行正常,直到有一次数据中心的突然断电.数据库镜像执行了故障转移,但是运维反馈说应用程序挂起了.当我们手动切换回来,应用程序又正常工作.为什么应用程序没有也故障转移呢? 这是使用数据库镜像的合理的常见问题,像这样的生产应用失败,是因为在镜像部署后没有做故障转移测试.在失败的故障转移之后我们感到棘手. 为了避免生产应用停机,我们在测试环境复制了线上的镜像环境.在确认应用和数据库镜像

网站的优化----首页优化---app调取服务端数据

高并发经常会发生在有大活跃用户量来访问网站的某个点,例如用户高聚集的业务场景中,如:抢购,促销等.为了让用户流畅的访问网站,来根据自己的业务设计适合系统的处理方案. //对于APP网站首页数据,通常是有APP请求服务端数据在本机进行绘制.APP越少的请求服务端的,就会减少服务器压力:资源和带宽. 1.服务端给APP下发的数据越少,减少无用字段的下发.就是APP需要什么,服务端下发什么. 2.APP每次请求服务端数据,服务端下发最新数据和数据版本号,APP可以缓存到本地,每次接口请求数据的时候,上

jquery.datatable插件从数据库读取数据

一.分页 分页的基本思想是根据datatable的页码及每页显示的行数,将数据从数据库分段提出,然后再填充到表格中,以达到分页的效果. 这里需要用到datatable插件的几个属性: "sEcho":这个属性需要原封不动地传回给datatable,具体的作用我也不清楚,但是根据它值的变化情况来看,好像是一个操作次数的计数(之前我一直把它当做是pageindex来用,结果发现,不论我在datatable中是翻下一页还是翻上一页,它一直在增加.) "iDisplayStart&q

云服务器 ECS Linux 系统盘数据转移方法

转自:https://help.aliyun.com/knowledge_detail/41400.html 问题描述 购买云服务器 ECS Linux 服务器时,未购买数据盘,使用一段时间后,随着业务增加,现有系统盘已无法满足业务需求.执行 df -h 查询空间使用率接近 100%,需要将数据转移至新购买的数据盘. 处理办法 针对此类情况,可参考以下思路进行解决. 注:涉及数据操作,操作前请注意通过快照等手段进行备份. 1. 购买数据盘,创建好分区后,在系统内挂载数据盘到 /mnt/shuju

客户端(浏览器端)数据存储技术概览

客户端(浏览器端)存储数据有诸多益处,最主要的一点是能快速访问(网页)数据.目前常见的浏览器端数据存储方法有:Cookies,Local Storage,Session Storage,IndexedDB. Cookies Cookies 是一种在文档内存储字符串数据最典型的方式.一般而言,cookies 会由服务端发送给客户端,客户端存储下来,然后在随后让请求中再发回给服务端.这可以用于诸如管理用户会话,追踪用户信息等事情. 此外,客户端也用使用 cookies 存储数据.因而,cookies

10天学会phpWeChat——第三天:从数据库读取数据到视图

在第二天,我们创建了我们的第一个phpWeChat功能模块,但是比较简单.实际生产环境中,我们不可能有如此简单的需求.更多的情况是数据存储在MySql数据库中,我们开发功能模块的作用就是将这些数据从MySql读取并通过视图多样化的呈现给用户. 今天我们进入<10天学会phpWeChat>系列教程的第三天:从数据库读取数据到视图. 一.首先,我们创建一个MySql数据文章表(pw_wechat_hello_article)用来存储要显示给用户的数据. 为了简单明了,这个表我们只保留3个字段: I

在C#应用程序中,利用表值参数过滤重复,批量向数据库导入数据,并且返回重复数据

在很多情况下,应用程序都需要实现excel数据导入功能,数据如果只有几十条,或上百条,甚至上千条,速度还好. 但是不仅如此,如果客户提供给你的excel本身存在着重复数据,或是excel中的某些数据已经在数据库存在,那这时,在向数据库插入数据前你还得判重,如果不存在才进行导入 通常,我们第一步就会通过上传的方式把excel中的数据读到内存,然后通过循环的方式得出一条一条数据,接着对于每条数据用关键字段去往数据库中进行一次查重,若存在则不做事情,若 不存在则向数据库中插入一条数据.这样一来,我们每

Oracle数据转移Mysql中遇到的问题以及解决办法

前几天因工作需要我得将Oracle数据库中几十张表转移到Mysql中,由于之前没有相关经验,上网简单百度后选用Navcat Premium软件工作. Navcat Premium进行数据转移有三种办法:1.复制表  2.导出.导入数据  3.导出成sql脚本,执行. 一开始使用复制表的方法,打开菜单栏"工具"的数据传输功能,左边选择要复制的表,右边选择连接然后选中目标数据库,接下在就是next by next的一键式操作.这个方法真的很方便,但是bug也很多,最大的bug是数值类型不匹