首先先说一下sp是干啥的:主要是从mysql迁移到sql server上,sp的用途就是备份数据,然后备份了多少就把原来表的数据删除多少,也不多说上图,上代码:
首先是配置表conf:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190815170304716.png
mysql 的sp:
CREATE DEFINER=`history`@`%` PROCEDURE `sp_archive_data`()
BEGIN
DECLARE v_tablename varchar(500);
DECLARE v_tableschema varchar(500);
DECLARE v_archivetablename varchar(500);
DECLARE v_daycount int;
DECLARE v_batchsize varchar(500);
DECLARE v_operate varchar(500);
DECLARE v_sqlcode varchar(500);
DECLARE done INT DEFAULT FALSE;
DECLARE cur_clear_table_info CURSOR FOR SELECT tableschema,tablename, archivedaycount,batchsize,archivetablename,operate FROM hgs_clear_history_data where status ='Y' order by id desc;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
set @thisday=left(now(),10);
OPEN cur_clear_table_info;
read_loop: LOOP
FETCH cur_clear_table_info INTO v_tableschema,v_tablename, v_daycount,v_batchsize,v_archivetablename,v_operate;
if done then
LEAVE read_loop;
end if;
-- get data count
set @sqlcode=concat('update hgs_clear_history_data set tempcount=
(select CEILING(count(*)/',v_batchsize,') from ',v_tableschema,'.',v_tablename, ' where DATE_FORMAT(editdt,\'%Y-%m-%d\') <= date_sub(\'',@thisday,'\',interval ',v_daycount,' day))
where tablename = \'',v_tablename,'\' limit 1');
PREPARE v_sqlcode from @sqlcode;
EXECUTE v_sqlcode;
DEALLOCATE PREPARE v_sqlcode;
set @count = (select tempcount from hgs_clear_history_data where tablename = v_tablename);
archive_loop:loop
if @count>0 then
if v_operate ='archive' then
-- create archive table
set @sqlcode=concat('CREATE TABLE IF NOT EXISTS ',v_archivetablename,' like ',v_tableschema,'.',v_tablename,'');
PREPARE v_sqlcode from @sqlcode;
EXECUTE v_sqlcode;
DEALLOCATE PREPARE v_sqlcode;
-- insert into archive table
/*add hgs_if_m_dsn_archive AutoID by wiki 2019-05-30*/
if v_archivetablename = 'hgs_if_m_dsn_archive' then
set @sqlcode=concat('insert into hgs_if_m_dsn_archive(pmfcode,wono,partno,sn,linecode,shiftcode,stagecode,ispass,
isfail,productiondate,scanby,scandt,actual,target,isabnormal,processcode,filename,editdt)
select pmfcode,wono,partno,sn,linecode,shiftcode,stagecode,ispass,isfail,productiondate,scanby,scandt,actual,target,
isabnormal,processcode,filename,editdt from ',v_tableschema,'.',v_tablename, ' where DATE_FORMAT(editdt,\'%Y-%m-%d\') <= date_sub(\'',@thisday,'\',interval ',v_daycount,' day) limit ',v_batchsize,' ');
PREPARE v_sqlcode from @sqlcode;
EXECUTE v_sqlcode;
DEALLOCATE PREPARE v_sqlcode;
elseif v_archivetablename = 'hgs_if_m_ict_archive' then
set @sqlcode=concat('insert into hgs_if_m_ict_archive(pmfcode,linecode,sgcode,sn,wono,partno,scandt,insertdt,cellno,
groupid,processid,eventpoint,tacktime,productiondate,actual,target,isabnormal,processcode,editdt)
select pmfcode,linecode,sgcode,sn,wono,partno,scandt,insertdt,cellno,groupid,processid,eventpoint,tacktime,productiondate,
actual,target,isabnormal,processcode,editdt from ',v_tableschema,'.',v_tablename, ' where DATE_FORMAT(editdt,\'%Y-%m-%d\') <= date_sub(\'',@thisday,'\',interval ',v_daycount,' day) limit ',v_batchsize,' ');
PREPARE v_sqlcode from @sqlcode;
EXECUTE v_sqlcode;
DEALLOCATE PREPARE v_sqlcode;
elseif v_archivetablename = 'hgs_if_m_dd_archive' then
set @sqlcode=concat('insert into hgs_if_m_dd_archive(pmfcode,productiondate,shiftcode,linecode,productcode,wono,serialno,
partno,qty,faildt,failcode,failtype,faildesc,editdt,failstation,repaircode,repaircodedesc)
select pmfcode,productiondate,shiftcode,linecode,productcode,wono,serialno,partno,qty,faildt,failcode,failtype,faildesc,
editdt,failstation,repaircode,repaircodedesc from ',v_tableschema,'.',v_tablename, ' where DATE_FORMAT(editdt,\'%Y-%m-%d\') <= date_sub(\'',@thisday,'\',interval ',v_daycount,' day) limit ',v_batchsize,' ');
PREPARE v_sqlcode from @sqlcode;
EXECUTE v_sqlcode;
DEALLOCATE PREPARE v_sqlcode;
elseif v_archivetablename = 'hgs_if_m_dps_archive' then
set @sqlcode=concat('insert into hgs_if_m_dps_archive(pmfcode,productiondate,shiftcode,linecode,
linecode2,wono,sortno,qty,productcode,productdesc,productname,requesthr,requesthour,field1,
field2,field3,field4,field5,COMMENT,planstartdt,planenddt,editdt,editby)
select pmfcode,productiondate,shiftcode,linecode,
linecode2,wono,sortno,qty,productcode,productdesc,productname,requesthr,requesthour,field1,
field2,field3,field4,field5,COMMENT,planstartdt,planenddt,editdt,editby from ',v_tableschema,'.',v_tablename, ' where DATE_FORMAT(editdt,\'%Y-%m-%d\') <= date_sub(\'',@thisday,'\',interval ',v_daycount,' day) limit ',v_batchsize,' ');
PREPARE v_sqlcode from @sqlcode;
EXECUTE v_sqlcode;
DEALLOCATE PREPARE v_sqlcode;
else
/*add hgs_if_m_dsn_archive AutoID by wiki 2019-05-30*/
set @sqlcode=concat('insert into ' ,v_archivetablename,'
select * from ',v_tableschema,'.',v_tablename, ' where DATE_FORMAT(editdt,\'%Y-%m-%d\') <= date_sub(\'',@thisday,'\',interval ',v_daycount,' day) limit ',v_batchsize,' ');
PREPARE v_sqlcode from @sqlcode;
EXECUTE v_sqlcode;
DEALLOCATE PREPARE v_sqlcode;
/*add hgs_if_m_dsn_archive AutoID by wiki 2019-05-30*/
end if;
/*add hgs_if_m_dsn_archive AutoID by wiki 2019-05-30*/
-- delete from table
set @sqlcode=concat('delete from ',v_tableschema,'.',v_tablename, ' where DATE_FORMAT(editdt,\'%Y-%m-%d\') <= date_sub(\'',@thisday,'\',interval ',v_daycount,' day) limit ',v_batchsize,'');
PREPARE v_sqlcode from @sqlcode;
EXECUTE v_sqlcode;
DEALLOCATE PREPARE v_sqlcode;
elseif v_operate ='delete' then
-- delete from table
set @sqlcode=concat('delete from ',v_tableschema,'.',v_tablename, ' where DATE_FORMAT(editdt,\'%Y-%m-%d\') <= date_sub(\'',@thisday,'\',interval ',v_daycount,' day) limit ',v_batchsize,'');
PREPARE v_sqlcode from @sqlcode;
EXECUTE v_sqlcode;
DEALLOCATE PREPARE v_sqlcode;
end if;
set @count= @count -1;
else
update hgs_clear_history_data set tempcount=0 where tablename = v_tablename limit 1;
leave archive_loop ;
end if;
end loop;
END LOOP;
END
然后转换成 SQL server的sp如下:
ALTER PROCEDURE [dbo].[sp_archive_data]
AS
BEGIN
SET XACT_ABORT ON
SET NOCOUNT ON
DECLARE @v_tablename nvarchar(500)
DECLARE @v_tableschema nvarchar(500)
DECLARE @v_archivetablename nvarchar(500)
DECLARE @v_daycount nvarchar(500)
DECLARE @v_batchsize nvarchar(500)
DECLARE @v_operate nvarchar(500)
DECLARE @v_sqlcode nvarchar(1000)
DECLARE @done int = 0
DECLARE @thisday nvarchar(20);
DECLARE @sqlcode nvarchar(1000);
DECLARE @count int = 0;
set @thisday=LEFT(CONVERT(varchar(100), GETDATE(), 120), 10);
DECLARE
cur_clear_table_info CURSOR LOCAL FORWARD_ONLY FOR
SELECT
hgs_clear_history_data.tableschema,
hgs_clear_history_data.tablename,
hgs_clear_history_data.archivedaycount,
hgs_clear_history_data.batchsize,
hgs_clear_history_data.archivetablename,
hgs_clear_history_data.operate
FROM DCHistory.dbo.hgs_clear_history_data
WHERE hgs_clear_history_data.status = 'Y'
ORDER BY hgs_clear_history_data.id DESC
OPEN cur_clear_table_info
/*
* SSMA informational messages:
* M2SS0003: The following SQL clause was ignored during conversion:
* read_loop : .
*/
WHILE (1 = 1)
BEGIN
FETCH cur_clear_table_info
INTO
@v_tableschema,
@v_tablename,
@v_daycount,
@v_batchsize,
@v_archivetablename,
@v_operate
IF @@FETCH_STATUS <> 0
SET @done = 1
IF @done <> 0
BREAK
SET @sqlcode =
(N'update hgs_clear_history_data set tempcount='+NCHAR(13)+NCHAR(10)+N'(select CEILING(count(*)/')
+ (@v_batchsize)+ (N') from ') + (@v_tableschema) + (N'.') +
(@v_tablename) + (N' where CONVERT(VARCHAR(10),editdt,120) <= ') +
(N'CONVERT(varchar(10),DATEADD(DAY,-')+(@v_daycount)+(N',''')+(@thisday)+
(N'''),120))') + (NCHAR(13)+NCHAR(10)) +(N' where tablename = ''')
+ (@v_tablename) + (N'''')
EXEC (@sqlcode)
SET @count =
(
SELECT hgs_clear_history_data.tempcount
FROM DCHistory.dbo.hgs_clear_history_data
WHERE hgs_clear_history_data.tablename = @v_tablename
)
WHILE(1 = 1)
BEGIN
IF @count > 0
BEGIN
IF @v_operate = 'archive'
BEGIN
-- 减少了备份表的自动创建 需要手动创建备份表在DCHistory中。因为表复制报异常 is not a valid identifier 需要动态执行sql 加上 sp_executesql
SET @sqlcode = (N' if not exists ' )
+(N'(select * from sysobjects where name = ''')
+(@v_archivetablename)
+(N''')')
+(N' select * into ')
+(@v_archivetablename)
+(N' from ')
+ (@v_tableschema)+ (N'.') + (@v_tablename)
+(N' where 1=0 ')
EXEC sp_executesql @sqlcode
IF @v_archivetablename = 'hgs_if_m_dsn_archive'
BEGIN
SET @sqlcode =
(N'insert into hgs_if_m_dsn_archive(pmfcode,wono,partno,sn,linecode,shiftcode,stagecode,ispass,'+NCHAR(13)+NCHAR(10)+NCHAR(9)+N'isfail,productiondate,scanby,scandt,actual,target,isabnormal,processcode,filename,editdt)'+NCHAR(13)+NCHAR(10))
+(N'select top ')
+(@v_batchsize)
+(N' pmfcode,wono,partno,sn,linecode,shiftcode,stagecode,
ispass,isfail,productiondate,scanby,scandt,actual,target,'+NCHAR(13)+NCHAR(10)+NCHAR(9)+NCHAR(9)+NCHAR(9)+N'isabnormal,processcode,filename,editdt from ')
+ (@v_tableschema)+ (N'.') + (@v_tablename) +
(N' where CONVERT(VARCHAR(10),editdt,120) <= ') +
(N'CONVERT(varchar(10),DATEADD(DAY,-')+(@v_daycount)+(N',''')+(@thisday)+
(N'''),120)')+ (N' ')
EXEC (@sqlcode)
END
ELSE IF @v_archivetablename = 'hgs_if_m_ict_archive'
BEGIN
SET @sqlcode =
(N'insert into hgs_if_m_ict_archive(pmfcode,linecode,sgcode,sn,wono,partno,scandt,insertdt,cellno,'+NCHAR(13)+NCHAR(10)+NCHAR(9)+N'groupid,processid,eventpoint,tacktime,productiondate,actual,target,isabnormal,processcode,editdt)'+NCHAR(13)+NCHAR(10))
+(N'select top ')
+(@v_batchsize)
+(N' pmfcode,linecode,sgcode,sn,wono,partno,scandt,insertdt,cellno,'+NCHAR(13)+NCHAR(10)+NCHAR(9)+NCHAR(9)+NCHAR(9)+N'groupid,processid,eventpoint,tacktime,productiondate,actual,target,isabnormal,processcode,editdt from ')
+ (@v_tableschema)+ (N'.') + (@v_tablename) +
(N' where CONVERT(VARCHAR(10),editdt,120) <= ') +
(N'CONVERT(varchar(10),DATEADD(DAY,-')+(@v_daycount)+(N',''')+(@thisday)+
(N'''),120)')+ (N' ')
EXEC (@sqlcode)
END
ELSE IF @v_archivetablename = 'hgs_if_m_dd_archive'
BEGIN
SET @sqlcode =
(N'insert into hgs_if_m_dd_archive(pmfcode,productiondate,shiftcode,linecode,productcode,wono,serialno,'+NCHAR(13)+NCHAR(10)+NCHAR(9)+N' partno,qty,faildt,failcode,failtype,faildesc,editdt,failstation,repaircode,repaircodedesc)'+NCHAR(13)+NCHAR(10))
+(N'select top ')
+(@v_batchsize)
+(N' pmfcode,productiondate,shiftcode,linecode,productcode,wono,serialno,partno,qty,faildt,failcode,failtype,faildesc,'+NCHAR(13)+NCHAR(10)+NCHAR(9)+NCHAR(9)+NCHAR(9)+N'editdt,failstation,repaircode,repaircodedesc from ')
+ (@v_tableschema)+ (N'.') + (@v_tablename) +
(N' where CONVERT(VARCHAR(10),editdt,120) <= ') +
(N'CONVERT(varchar(10),DATEADD(DAY,-')+(@v_daycount)+(N',''')+(@thisday)+
(N'''),120)')+ (N' ')
EXEC (@sqlcode)
END
ELSE IF @v_archivetablename = 'hgs_if_m_dps_archive'
BEGIN
SET @sqlcode =
(N'insert into hgs_if_m_dps_archive(pmfcode,productiondate,shiftcode,linecode,'
+NCHAR(13)+NCHAR(10)+NCHAR(9)
+N' linecode2,wono,sortno,qty,productcode,productdesc,productname,requesthr,requesthour,field1,'
+NCHAR(13)+NCHAR(10)+NCHAR(9)
+N' field2,field3,field4,field5,COMMENT,planstartdt,planenddt,editdt,editby)'
+NCHAR(13)+NCHAR(10))
+(N'select top ')
+(@v_batchsize)
+(N'pmfcode,productiondate,shiftcode,linecode,linecode2,wono,sortno,qty,productcode,productdesc,productname,requesthr,requesthour,field1, field2,field3,field4,field5,COMMENT,planstartdt,planenddt,editdt,editby from ')
+ (@v_tableschema)+ (N'.') + (@v_tablename) +
(N' where CONVERT(VARCHAR(10),editdt,120) <= ') +
(N'CONVERT(varchar(10),DATEADD(DAY,-')+(@v_daycount)+(N',''')+(@thisday)+
(N'''),120)')+ (N' ')
EXEC (@sqlcode)
END
ELSE
BEGIN
SET @sqlcode =(N'insert into ') + (@v_archivetablename)+
(NCHAR(13)+NCHAR(10)+N' select top ')+(@v_batchsize)+(N' * from ') + (@v_tableschema) + (N'.')+ (@v_tablename)+ (N' where CONVERT(VARCHAR(10),editdt,120) <= ') +
(N'CONVERT(varchar(10),DATEADD(DAY,-')+(@v_daycount)+(N',''')+(@thisday)+
(N'''),120)')+ (N' ')
EXEC (@sqlcode)
END
SET @sqlcode = (N'delete top( ')+(@v_batchsize)+(') from ')+
(@v_tableschema)+(N'.')
+ (@v_tablename)+ (N' where CONVERT(VARCHAR(10),editdt,120) <= ') +
(N'CONVERT(varchar(10),DATEADD(DAY,-')+(@v_daycount)+(N',''')+(@thisday)+
(N'''),120)')+ (N' ')
EXEC (@sqlcode)
END
ELSE
BEGIN
IF @v_operate = 'delete'
BEGIN
SET @sqlcode = (N'delete top( ')+(@v_batchsize)+(') from ')+
(@v_tableschema)+(N'.')
+ (@v_tablename)+ (N' where CONVERT(VARCHAR(10),editdt,120) <= ') +
(N'CONVERT(varchar(10),DATEADD(DAY,-')+(@v_daycount)+(N',''')+(@thisday)+
(N'''),120)')+ (N' ')
EXEC (@sqlcode)
END
ELSE
BEGIN
SELECT @v_operate;
END
END
SET @count = @count - 1
END
ELSE
BEGIN
UPDATE TOP (1) DCHistory.dbo.hgs_clear_history_data SET tempcount = N'0'
WHERE hgs_clear_history_data.tablename = @v_tablename
BREAK
END
END
END
END
这篇文章 主要想记录一下日常的工作内容,这是一个简单的案例,希望对大家有帮助。