Dynami c SQL Сравнение DateTime, когда архив данных не работает - PullRequest
0 голосов
/ 04 мая 2020

Я написал эту хранимую процедуру для очистки данных из одной из моих таблиц. Я сделал его настраиваемым либо для архивации данных, либо для полного удаления. Поскольку объем данных очень большой, я использую циклы, чтобы сделать то же самое. Часть удаления работает нормально. Однако архивная часть доставляет мне трудные времена, и я застрял там с несколькими попытками. Вот мой 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. Может кто-нибудь, пожалуйста, помогите мне в этом. Заранее спасибо.

1 Ответ

0 голосов
/ 04 мая 2020

Кажется, что вы используете SQL 2016 или выше, попробуйте CONCAT, что-то вроде:

select concat('SELECT * INTO [cbr_audit_Backup_', @date,'] FROM [cbr_audit] WITH (NOLOCK) where convert(datetime,dateCreated,121) <=  ''', CONVERT(varchar(30), @archivedate , 121), '''')

еще несколько вещей: я настоятельно рекомендую вам всегда использовать стиль 121 (канонический)

  • или 126 (ISO8601), так что SQL не будет смущен мм / дд / гггг (101) или дд / мм / гггг (103).
  • , который вы удаляете с помощью куски, но транзакция для всего блока. рассмотрите возможность выполнения только транзакции для каждого удаления (неявного)
  • вместо вставки в, а затем удаления, посмотрите предложение OUTPUT, чтобы УДАЛИТЬ здесь
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...