sql - 数据归档不工作时的动态 SQL 日期时间比较
问题描述
我已经为我的一张表中的数据清除编写了这个存储过程。我已将其配置为存档数据或进行硬删除。由于数据量很大,我正在使用循环来做同样的事情。它的删除部分工作正常但是它的存档部分给我带来了困难,我多次尝试被困在那里。这是我的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 中,在代码的存档部分中,动态 sql 没有给出任何结果。DateCreated 是 Datetime 类型。有人可以帮我解决这个问题。提前致谢。
解决方案
似乎您使用的是 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 就不会被 mm/dd/yyyy (101) 或 dd/mm/yyyy (103) 混淆。
- 您正在按块删除,但事务是针对所有块的。考虑为每个删除只做事务(隐式)
- 而是插入然后删除,在这里查看 OUTPUT 子句以删除
推荐阅读
- java - 将 jar 部署在 tomcat 和 remane 旧 jar 上,但服务器仍在读取旧 jar
- html - 如何使这个 ::before 元素的阴影位于整个标题 div 的下方?
- openstreetmap - 以地理空间格式下载 osm 数据
- apache-flink - 具有巨大状态的 Flink 恢复/重启作业
- javascript - 数组javascript中的reverse()方法?
- reactjs - React 路由 - 是否保留了组件状态值,并且 useReducer 可以与其中的一些 useState 变量一起使用吗?
- wso2 - WSO2 scim 无法获取 lastPasswordUpdateTime
- python - 在 Python 中播放声音
- amazon-web-services - 删除处于“已存储”状态的 SQS 消息
- python - 如何使用get函数将参数/参数传递给lambda函数,该函数是python字典中的值?