Я написал эту хранимую процедуру для очистки данных из одной из моих таблиц. Я сделал его настраиваемым либо для архивации данных, либо для полного удаления. Поскольку объем данных очень большой, я использую циклы, чтобы сделать то же самое. Часть удаления работает нормально. Однако архивная часть доставляет мне трудные времена, и я застрял там с несколькими попытками. Вот мой SP.
ALTER PROCEDURE [dbo].[spPurgeRecords_new] (
@Age AS INT,
@NumberOfLoops AS BIGINT,
@DeleteSize BIGINT,
@IsArchive BIT
)
AS
SET NOCOUNT ON
SET XACT_ABORT ON
BEGIN
DECLARE @CurrentLoop AS BIGINT;
SET @CurrentLoop = 0
declare @cutoffDate datetime;
declare @maxXDate datetime;
declare @loop varchar(50);
select @cutoffDate = dateadd(year,-@Age,getdate())
select @maxXDate = max(dateCreated) from cbr_audit where dateCreated < @cutoffDate
declare @date varchar(100), @cmd varchar(1000),@archivedate varchar(100)
set @date = (select FORMAT(getdate(), 'yyyyMMdd'));
set @archivedate = (select FORMAT(@maxXDate, 'yyyyMMdd'));
declare @backupTable varchar(100)
set @backupTable = 'cbr_audit_Backup_' + @date;
BEGIN TRY
BEGIN TRANSACTION
WHILE @CurrentLoop < @NumberOfLoops
BEGIN
IF @IsArchive = 1
BEGIN
--Archive the records into a backup table
IF OBJECT_ID (@backupTable, N'U') IS NULL
begin
set @cmd = 'SELECT * INTO [cbr_audit_Backup_'+ @date +'] FROM [cbr_audit] WITH (NOLOCK) where convert(datetime,dateCreated,101) <= CONVERT(DATETIME, ''' + @archivedate + ''', 101)'
exec(@cmd)
end
--Delete the rows from cbr_audit table
DELETE
FROM dbo.cbr_audit
WHERE id IN
(SELECT TOP(@DeleteSize) id
FROM dbo.cbr_audit WITH (NOLOCK)
WHERE dateCreated <= @maxXDate);
END
ELSE
BEGIN
-- Delete the records
DELETE
FROM dbo.cbr_audit
WHERE id IN
(SELECT TOP(@DeleteSize) id
FROM dbo.cbr_audit WITH (NOLOCK)
WHERE dateCreated <= @maxXDate);
END
-- WAITFOR DELAY '00:00:00:500';
SET @CurrentLoop = @CurrentLoop + 1;
set @loop = cast(@currentloop as varchar(50))
RAISERROR (@loop, 0, 1) WITH NOWAIT
END
COMMIT TRANSACTION
END TRY
BEGIN CATCH
--Rollback
RETURN
END CATCH
END
В этом SP, в части архива кода, Dynami c sql не дает никаких результатов. DateCreated имеет тип Datetime. Может кто-нибудь, пожалуйста, помогите мне в этом. Заранее спасибо.