I wanted to write a T-SQL script for archival of large table.
CREATE PROCEDURE spArchiveTable
(
@TNAME NVARCHAR(100),
@CNAME NVARCHAR(100),
@FDATE DATETIME,
@TDATE DATETIME
)
AS
BEGIN
BEGIN TRY
DECLARE @SQL NVARCHAR(MAX)
DECLARE @ARCHTNAME NVARCHAR(200)
DECLARE @TOTALDATA INT
SET @FDATE = CONVERT(NVARCHAR(30),@FDATE,106) +' 00:00:00.000'
SET @TDATE = CONVERT(NVARCHAR(30),@TDATE,106) +' 23:59:59.900'
SET @SQL = 'SELECT @TOTALDATA = COUNT(*) FROM '+ @TNAME+' WHERE '+@CNAME+' BETWEEN '''+CAST(@FDATE AS VARCHAR(30))+''' AND '''+CAST(@TDATE AS VARCHAR(30))+''''
/* Find total available data for delation */
EXEC sp_executesql
@query = @SQL,
@params = N'@TOTALDATA INT OUTPUT',
@TOTALDATA = @TOTALDATA OUTPUT
/* Check if data is available then do rest of the things */
IF (@TOTALDATA > 0)
BEGIN
SET @ARCHTNAME = 'Archive_'+@TNAME+'_'+LEFT(CONVERT(NVARCHAR(30),@FDATE,106),2)+LEFT(DATENAME(mm, @FDATE),3)+RIGHT(DATENAME(yy, @FDATE),2)+'_To_'+LEFT(CONVERT(NVARCHAR(30),@TDATE,106),2)+LEFT(DATENAME(mm, @TDATE),3)+RIGHT(DATENAME(yy, @TDATE),2)+'_'+CAST(@TOTALDATA AS VARCHAR(20))
SET @SQL = 'SELECT * INTO '+@ARCHTNAME+' FROM '+@TNAME+' WHERE '+@CNAME+' BETWEEN '''+CAST(@FDATE AS VARCHAR(30))+''' AND '''+CAST(@TDATE AS VARCHAR(30))+''''
PRINT '/* Archive records in another table */'
PRINT @SQL
PRINT ''
EXEC(@SQL)
SET @SQL = 'DELETE FROM '+@TNAME+' WHERE '+@CNAME+' BETWEEN '''+CAST(@FDATE AS VARCHAR(30))+''' AND '''+CAST(@TDATE AS VARCHAR(30))+''''
PRINT '/* Delete records from table */'
PRINT @SQL
PRINT ''
EXEC(@SQL)
SET @SQL = 'ALTER INDEX ALL ON '+@TNAME+' REBUILD'
EXEC(@SQL)
PRINT '/* Now rebuild index of table */'
PRINT @SQL
PRINT ''
END
ELSE
BEGIN
PRINT 'There is no any data.'
END
END TRY
BEGIN CATCH
SELECT 'Error' AS 'Error' , ERROR_MESSAGE() AS 'Error Details'
END CATCH
END
EXEC spArchiveTable <TableName>,<ColName>,<FromDate>,<ToDate>
TableName: Pass table name
ColName:Here colname as date time on basis of this we will filter data.
FromDate:Start Date
ToDate: End date.
No comments:
Post a Comment