IF OBJECT_ID ('dbo.ARCHIVE_LCHIS_TASK') IS NOT NULL
DROP PROCEDURE dbo.ARCHIVE_LCHIS_TASK
GO
--EXEC ARCHIVE_LCHIS_TASK
CREATE PROCEDURE ARCHIVE_LCHIS_TASK
AS
BEGIN
DECLARE @V_MON INT
DECLARE @VSQL VARCHAR(8000)
DECLARE @VSQL_DEL VARCHAR(8000)
DECLARE @VSQL_UPDATE VARCHAR(8000)
DECLARE @tab_name VARCHAR(80)
DECLARE @S_MON CHAR(4)
DECLARE @error INT
DECLARE @V_AR_MON CHAR(4)
DECLARE @V_ROWCOUNT INT
DECLARE @his_tab_name VARCHAR(80)
SET @V_MON = 12
WHILE @V_MON > 0
BEGIN
SELECT @S_MON = CASE
WHEN @V_MON >= 10
THEN CONVERT(VARCHAR(2), @V_MON)
ELSE
'0' + CONVERT(VARCHAR(2), @V_MON)
END
DECLARE Stb_name SCROLL CURSOR FOR
SELECT 'INSERT INTO lchis.dbo.' + TAB_NAME + '_' + @S_MON +
' SELECT * FROM ' + TAB_NAME +
' WHERE REPORT_DATE <= CONVERT(CHAR, DATEADD(MM, -' + AR_MONTH + ', GETDATE()), 111)
AND ARCHIVE_STATUS<>''SUCCESS'' AND MONTH(REPORT_DATE) = ' + CONVERT(VARCHAR(2), @V_MON),
TAB_NAME,
AR_MONTH
FROM ARCHIVE_TABLE
WHERE ENABLE_FLAG = 'YES'
OPEN Stb_name
FETCH Stb_name INTO @VSQL, @tab_name, @V_AR_MON
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @error = 0
SET @V_ROWCOUNT = 1
SET ROWCOUNT 100000
WHILE @V_ROWCOUNT > 0
BEGIN
BEGIN TRANSACTION
SELECT @his_tab_name=@tab_name+ '_' + @S_MON
EXECUTE(@VSQL)
SELECT @error = @@ERROR, @V_ROWCOUNT = @@ROWCOUNT
IF @V_ROWCOUNT = 1
BEGIN
ROLLBACK TRANSACTION
BREAK
END
SET @VSQL_UPDATE = 'UPDATE ' + @tab_name +
' SET ARCHIVE_STATUS=''SUCCESS'' WHERE REPORT_DATE <= CONVERT(CHAR, DATEADD(MM, -' + @V_AR_MON + ', GETDATE()), 111)
AND ARCHIVE_STATUS<>''SUCCESS'' AND MONTH(REPORT_DATE) = ' + CONVERT(VARCHAR(2), @V_MON)
EXECUTE(@VSQL_UPDATE)
SELECT @error = @error + @@ERROR, @V_ROWCOUNT = @@ROWCOUNT
IF @error = 0
BEGIN
INSERT INTO ARCHIVE_TOLCHIS_LOG(ARCHIVE_TIME,TABLE_NAME,ARCHIVE_COUNTS)
VALUES(getdate(),@his_tab_name,@V_ROWCOUNT)
COMMIT TRANSACTION
END
ELSE
BEGIN
ROLLBACK TRANSACTION
END
END
FETCH Stb_name INTO @VSQL, @tab_name, @V_AR_MON
END
CLOSE Stb_name
DEALLOCATE Stb_name
SET @V_MON = @V_MON - 1
END
END
GO
ARCHIVE_TABLE是 自建的归档配置表,可以配置需要归档的表名称,归档多久之前的旧数据
删除已归档数据的存储过程
IF OBJECT_ID ('dbo.ARCHIVE_DEL_TASK') IS NOT NULL
DROP PROCEDURE dbo.ARCHIVE_DEL_TASK
GO
CREATE PROCEDURE ARCHIVE_DEL_TASK
AS
BEGIN
DECLARE @V_MON INT
DECLARE @VSQL_DEL VARCHAR(8000)
DECLARE @tab_name VARCHAR(80)
DECLARE @S_MON CHAR(4)
DECLARE @error INT
DECLARE @V_AR_MON CHAR(4)
DECLARE @V_ROWCOUNT INT
DECLARE @his_tab_name VARCHAR(80)
DECLARE Stb_name SCROLL CURSOR FOR
SELECT
TAB_NAME,
AR_MONTH
FROM ARCHIVE_TABLE
WHERE ENABLE_FLAG = 'YES'
OPEN Stb_name
FETCH Stb_name INTO @tab_name, @V_AR_MON
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @error = 0
SET @V_ROWCOUNT = 1
SET ROWCOUNT 100000
WHILE @V_ROWCOUNT > 0
BEGIN
BEGIN TRANSACTION
SET @VSQL_DEL = 'DELETE FROM ' + @tab_name +
' WHERE REPORT_DATE <= CONVERT(CHAR, DATEADD(MM, -' + @V_AR_MON + ', GETDATE()), 111)
AND ARCHIVE_STATUS=''SUCCESS'''
EXECUTE(@VSQL_DEL)
SELECT @error = @error + @@ERROR, @V_ROWCOUNT = @@ROWCOUNT
IF @error = 0
BEGIN
COMMIT TRANSACTION
END
ELSE
BEGIN
ROLLBACK TRANSACTIO
END
END
FETCH Stb_name INTO @tab_name, @V_AR_MON
END
CLOSE Stb_name
DEALLOCATE Stb_name
END
GO