I had the priveledge of working on a document management system recently. Unfortunately, for whatever reason, there were new tables created for each year. For example, documents imported into the database in 2011 were in table Documents_2011. There were over 200 databases, and to make matters worse, not all databases contained every year. If the client started in 2008, there were tables starting from 2008. If they started in 2011, the first table would be 2011. After running a few thoughts in my head, I decided to try the new SQL TRY CATCH block.
I first found the earliest year that was used. In this case it was 2002. Start by creating a temp table. Next, use a WHILE loop and start at the first year possible. Dynamically create an INSERT INTO SELECT statement. Execute the statement. Add 1 to the year and continue looping until the current year.
Since this database required scripts to be run at the beginning of each year, this stored procedure would not have to change since it dynamically queries all tables from START year to CURRENT year.
CREATE PROCEDURE SelectDocumentsToBeArchived
@RetentionPeriod INT
AS
DECLARE @YEAR INT = 2002
DECLARE @SQL VARCHAR(8000) = ''
DECLARE @CUTOFFDATE DATE
SET NOCOUNT ON
SET @CUTOFFDATE = DATEADD(MONTH, -@RetentionPeriod, GETDATE())
CREATE TABLE #tmp_ToBeArchived (DocID BIGINT,[FileName] VARCHAR(256))
WHILE @YEAR <= YEAR(GETDATE())
BEGIN
BEGIN TRY
SET @SQL = 'INSERT INTO #tmp_ToBeArchived SELECT DocID, [FileName]'
SET @SQL = @SQL + ' FROM DOCUMENTS_' + CAST(@YEAR AS VARCHAR(4)) + ' DOCUMENTS'
SET @SQL = @SQL + ' WHERE DOCUMENTS.DateImported < ''' + CAST(@CUTOFFDATE AS VARCHAR(10)) + ''''
SET @SQL = @SQL + ' AND ISNULL(DOCUMENTS.Deleted,0) = 0'
--PRINT @SQL
EXEC(@SQL)
END TRY
BEGIN CATCH
PRINT @SQL
PRINT ERROR_MESSAGE()
END CATCH
SET @YEAR = @YEAR + 1
END
;
SET NOCOUNT OFF
SELECT #tmp_ToBeArchived.* FROM #tmp_ToBeArchived
ORDER BY DocID
DROP TABLE #tmp_ToBeArchived
GO
I first found the earliest year that was used. In this case it was 2002. Start by creating a temp table. Next, use a WHILE loop and start at the first year possible. Dynamically create an INSERT INTO SELECT statement. Execute the statement. Add 1 to the year and continue looping until the current year.
Since this database required scripts to be run at the beginning of each year, this stored procedure would not have to change since it dynamically queries all tables from START year to CURRENT year.
CREATE PROCEDURE SelectDocumentsToBeArchived
@RetentionPeriod INT
AS
DECLARE @YEAR INT = 2002
DECLARE @SQL VARCHAR(8000) = ''
DECLARE @CUTOFFDATE DATE
SET NOCOUNT ON
SET @CUTOFFDATE = DATEADD(MONTH, -@RetentionPeriod, GETDATE())
CREATE TABLE #tmp_ToBeArchived (DocID BIGINT,[FileName] VARCHAR(256))
WHILE @YEAR <= YEAR(GETDATE())
BEGIN
BEGIN TRY
SET @SQL = 'INSERT INTO #tmp_ToBeArchived SELECT DocID, [FileName]'
SET @SQL = @SQL + ' FROM DOCUMENTS_' + CAST(@YEAR AS VARCHAR(4)) + ' DOCUMENTS'
SET @SQL = @SQL + ' WHERE DOCUMENTS.DateImported < ''' + CAST(@CUTOFFDATE AS VARCHAR(10)) + ''''
SET @SQL = @SQL + ' AND ISNULL(DOCUMENTS.Deleted,0) = 0'
--PRINT @SQL
EXEC(@SQL)
END TRY
BEGIN CATCH
PRINT @SQL
PRINT ERROR_MESSAGE()
END CATCH
SET @YEAR = @YEAR + 1
END
;
SET NOCOUNT OFF
SELECT #tmp_ToBeArchived.* FROM #tmp_ToBeArchived
ORDER BY DocID
DROP TABLE #tmp_ToBeArchived
GO
0 comments:
Post a Comment