一、使用场景
今天在工作时遇到了一个问题,如何将两库源的表进行定时备份?在查找资料的时候,查到的都是直接使用sqlserver内置配件配置的,因此我尝试使用sql语句写了一遍。需求是这样的:每隔一分钟,将表A的数据备份到表B中,对于已存在的数据则不再进行备份。此次不写如何连接两数据库,如有需要请留言,我会再补充。
二、整体思路
大体的思路是:
1、声明变量后进入死循环,将要备份的A表数据全部取出
2、使用游标拿到表A的一条数据
3、与表B进行对比,如果存在则不备份,若不存在则备份。
4、然后循环拿到每一条数据进行比对
5、设置时间延迟1分钟
6、再次进入死循环
7、如果要停止死循环,需手动点击sqlserver的停止按钮
三、sql语句
--每隔1分钟将A库A表备份到B库B表,如果有重复则不备份,Account为唯一值
--声明变量(变量结构与B表结构一致)
DECLARE @Account varchar(30)
DECLARE @Password varchar(20)
DECLARE @TelNumber varchar(11)
DECLARE @IMEI varchar(15)
--设置死循环,只有在强制关闭时才停止备份
WHILE(1<3)
BEGIN
--声明游标
DECLARE testcursor CURSOR
--取得所有要遍历的数据
FOR(SELECT Account,Password,TelNumber,IMEI FROM A)
OPEN testcursor;
--抓取一条数据
FETCH NEXT FROM testcursor INTO @Account,@Password,@TelNumber,@IMEI;
--在游标内数据量为0时跳出循环
WHILE @@FETCH_STATUS=0
BEGIN
--判断表B中是否存在当前游标内A表的Account数据
IF NOT EXISTS(SELECT Account FROM B WHERE Account IN(@Account))
--如果不存在,则插入这一条数据
INSERT INTO B
(Account,Password,TelNumber,IMEI)
VALUES(@Account,@Password,@TelNumber,@IMEI)
--抓取下一条游标数据
FETCH NEXT FROM testcursor INTO @Account,@Password,@TelNumber,@IMEI
END;
--在本阶段所有数据遍历插入完毕后,延迟一分钟
WAITFOR DELAY '00:01:00'
--关闭当前游标
CLOSE testcursor;
DEALLOCATE testcursor;
--进入下一次循环
END;