有时工作需要需要把当前表的数据,移到历史表中,而历史表基本是以时间(年)为后缀来命名历史表的,如 A_2011,A_2012,在移数据时,要按数据的时间,移到不同的表中,且由于如果数据有同步。一次处理的数据不能太大。否则同步链会被Block.所以需要批理处理。

下面是一个通用的写法,可以作为参考!(这个应该是出自邹建大侠之手,因为需要写这样的处理,去找了下类似代码,找到的)

-- row batch:                100
-- row Process limit:       50000
-- data keep days:          90
-- */
CREATE PROCEDURE dbo.TransferNInvoiceToHistoryBeforeDay@FromDate char(10)
AS
SET NOCOUNT ON;-- current trancount
DECLARE@__trancount int;
SELECT@__trancount = @@TRANCOUNT;BEGIN TRYDECLARE@row_batch int,@row_limit int,@row_process int,@row_count int,@date_begin datetime,@date_end datetime;-- row batch and data keep dateSELECT@row_batch = 100,                                   -- each batch process rows@row_limit = 50000,                         -- total row process limit@date_end = @FromDate,--DATEDIFF(Day, 90, GETDATE()),  -- process top date@row_process = 0;                                              -- process rows total-- ===========================================-- get process begin date and rowsSELECT@date_begin = MIN(InvoiceDate),@row_count = COUNT(*)FROM 需要处理的当前表名   WITH(NOLOCK)WHERE InvoiceDate < @date_end;IF @row_count = 0        RETURN;ELSE IF @date_begin IS NULLBEGINRAISERROR(N'column InvoiceDate include NULL value, please fix it', 16, 1)ENDIF @row_limit IS NULL OR @row_limit <= 0SET @row_limit = @row_count;RAISERROR('%d rows need process, current process limit %d rows', 10, 1, @row_count, @row_limit) WITH NOWAIT-- ===========================================-- process by yearDECLARE@date datetime;SET @date = @date_begin;WHILE @row_process < @row_limitAND @date < @date_endBEGIN-- process date and sqlDECLARE@sql nvarchar(4000),@_date_begin datetime,@_date_end datetime;SELECT@_date_begin = @date,@_date_end = CASEWHEN DATEDIFF(Year, @_date_begin, @date_end) = 0 THEN @date_endELSE DATEADD(Year, YEAR(@_date_begin) - 1899, 0)END,@date = @_date_end,@row_count = @row_batch,@sql = N'
DECLARE @tb_id TABLE(invoiceNumber intPRIMARY KEY
);
INSERT @tb_id
SELECT TOP(@row_batch)invoiceNumber
FROM Nact.dbo.NewEgg_InvoiceMaster A
WHERE InvoiceDate >= @_date_beginAND InvoiceDate < @_date_end;DELETE A
OUTPUT deleted.*INTO 历史表名不带时间部份' + RTRIM(Year(@_date_begin)) + N'
FROM 当前表名 A,@tb_id B
WHERE A.invoiceNumber = B.invoiceNumber;
';-- ===========================================-- process by batch for yearWHILE @row_process < @row_limitAND @row_count = @row_batchBEGIN-- move dataIF @__trancount = 0BEGIN TRAN;ELSESAVE TRAN __TRAN_SavePoint;EXEC sys.sp_executesql@sql,N'@row_batch int,@_date_begin datetime,@_date_end datetime                    ',@row_batch, @_date_begin, @_date_end;SELECT@row_count = @@ROWCOUNT,@row_process = @row_process + @row_count;IF XACT_STATE() = 1 AND @__trancount = 0COMMIT;ENDENDIF @__trancount = 0BEGINIF XACT_STATE() = -1ROLLBACK TRAN;ELSEBEGIN       WHILE @@TRANCOUNT > 0COMMIT TRAN;ENDEND
END TRY
BEGIN CATCHIF XACT_STATE() <> 0BEGINIF @__trancount = 0ROLLBACK TRAN;ELSE IF XACT_STATE() = 1 AND @@TRANCOUNT > @__trancountROLLBACK TRAN __TRAN_SavePoint;ENDDECLARE@__error_number int,@__error_message nvarchar(2048),@__error_severity int,@__error_state int,@__error_line int,@__error_procedure nvarchar(126),@__user_name nvarchar(128),@__host_name nvarchar(128);SELECT@__error_number = ERROR_NUMBER(),@__error_message = ERROR_MESSAGE(),@__error_severity = ERROR_SEVERITY(),@__error_state = ERROR_STATE(),@__error_line = ERROR_LINE(),@__error_procedure = ERROR_PROCEDURE(),@__user_name = SUSER_SNAME(),@__host_name = HOST_NAME();RAISERROR(N'User: %s, Host: %s, Procedure: %s, Error %d, Level %d, State %d, Line %d, Message: %s ',@__error_severity,1,@__user_name,@__host_name,@__error_procedure,@__error_number,@__error_severity,@__error_state,@__error_line,@__error_message);
END CATCHGO

迁移数据到历史表SQL相关推荐

  1. mysql游标表间数据迁移_MySQL存储过程--通过游标遍历和异常处理迁移数据到历史表...

    -- 大表数据迁移,每天凌晨1点到5点执行,执行间隔时间10分钟,迁移旧数据到历史表.DELIMITER $$ USE `dbx`$$ DROP PROCEDURE IF EXISTS `pro_xx ...

  2. mysql游标表间数据迁移_FalseMySQL存储过程--gt;通过游标遍历和异常处理迁移数据到历史表-mysql-第二电脑网...

    -- 大表数据迁移,每天凌晨1点到5点执行,执行间隔时间10分钟,迁移旧数据到历史表.DELIMITER $$ USE `dbx`$$ 电脑技术网对<FalseMySQL存储过程-->通过 ...

  3. mysql存储过程表迁移for_MySQL存储过程--通过游标遍历和异常处理迁移数据到历史表 (转)...

    -- 大表数据迁移,每天凌晨1点到5点执行,执行间隔时间10分钟,迁移旧数据到历史表. DELIMITER $$ USE `dbx`$$ DROP PROCEDURE IF EXISTS `pro_x ...

  4. MySQL存储过程 -- 通过游标遍历和异常处理迁移数据到历史表

    -- 大表数据迁移,每天凌晨1点到5点执行,执行间隔时间10分钟,迁移旧数据到历史表. DELIMITER $$ USE `dbx`$$ DROP PROCEDURE IF EXISTS `pro_x ...

  5. mysql 将三个月的数据导到历史表_迁移数据到历史表,减少业务表中数据压力 Mysql...

    #数据迁移存储过程 DROP PROCEDURE IF EXISTS `delete_platform_patient`; DELIMITER ;; CREATE DEFINER=`root`@`%` ...

  6. Mysql定义DELETE操作触发器,将删除数据存入历史表

    Mysql定义DELETE操作触发器,将删除数据存入历史表 SQL如下: // An highlighted blockDELIMITER $$ CREATE TRIGGER <触发器名称> ...

  7. MySql定期备份数据到历史表的解决方案

    前言 互联网项目最大不瓶颈还是在于数据库,80%的数据请求只针对20%的数据:特别是电商项目,体现的更为明显,大量的数据请求,即使MySql在一主多从,读写分离,使用了Elasticsearch.Me ...

  8. mysql定时任务,把7天的数据存到历史表,再删除7天前的数据

    查看mysql事件是否已开启,ON开,OFF关. SHOW VARIABLES LIKE 'event_scheduler'1:新建存储过程.use 数据库名; delimiter$$ #设置mysq ...

  9. mysql导vertica_vertica从其他表迁移数据到新表(insertinto语句用法实例)

    #例:迁移微博用户数据. 由于源表weiboFriend与目标表weiboUser的表结构不完全相同,因此在语句不但要严排列字段顺序,而且还要用缺省(如:'' 等)补齐源表中没有的字段 具体SQL语句 ...

最新文章

  1. 一个电脑白痴与黑客的对话
  2. vivado实现VGA
  3. python微信自动打卡_「微信辅助」吃鸡再也不怕了,Python用wxpy实现微信自动回复...
  4. java正则表达式 分词_[Java]使用正则表达式实现分词
  5. putty的的颜色配置步骤
  6. 戴尔企业级技术社区达人积分等级制度
  7. Springboot+vue项目旅游管理系统
  8. 化学元素周期表外层电子排列规律
  9. Magick.NET Crack,支持多种文件格式的综合库
  10. Android ADB USB 驱动 万能配置方式
  11. dell Vostro3670安装固态硬盘、win10系统教程
  12. Xcode 和 Mac 的一些快捷键
  13. $route.push()多次点击跳转报错问题
  14. 第4章 JavaScript表达式与运算符
  15. 非法使用long类型数据
  16. PLC数据采集网关的作用是什么,PLC数据采集网关的功能都有哪些
  17. TMS320F28335 实现printf在调试终端打印
  18. stm32上实现3色led灯的(呼吸灯模式)以及对激光模块和金属触摸模块的应用解读
  19. C语言数据结构篇——双链表的创建,插入,节点删除,打印等操作
  20. oracle i_obj4,【案例】Oracle报错ORA-08102产生原因和MOS官方解决办法

热门文章

  1. 思迅软锁安装配置说明
  2. 啥是“quoting reference XXX” 递交申请材料时
  3. springboot笔记(硅谷)
  4. 打印机乱码故障解决办法
  5. (附源码)spring boot中小学餐饮配送系统 毕业设计645661
  6. office@word官方文档查看@审阅@批注@修订
  7. android迷宫图像生成,Android - 绘制一个迷宫,以平滑的角色移动的画布
  8. 智能家居的春天来临 曾经共患难的集成商如今能同享福吗?
  9. 你的代码暴漏了你的年龄(毕业设计)--技术文档+程序源代码
  10. 如何在Commander One中显示隐藏文件?