mysql的sp转sql server 的sp 案例!

首先先说一下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

这篇文章 主要想记录一下日常的工作内容,这是一个简单的案例,希望对大家有帮助。

发布了52 篇原创文章 · 获赞 31 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_39361934/article/details/99644385