作为新版本的一部分,我们偶尔会对几张表进行备份,然后在稳定期内将其删除。 我想让它可配置,即为要删除的表列表设置命名约定,然后在稳定期结束后删除它
这是我的计划。
因此,我将创建一个存储过程,它将选择所有具有 TBR 后缀的表,并将其放入临时表中,并附上日期时间 例如
select
name AS 'TableName',
convert (datetime, substring (name, len(name)-7,8)) as 'DeletedOn'
from
sys.tables
where
name like '%_tbr_%' and
type ='u'
现在
SELECT TableName FROM #TempTable WHERE DeletedOn <=GETDATE()
这将选择超出指定日期的所有表。 现在,声明一个游标,然后循环并删除它。
我会安排一个工作每周运行一次这个存储过程,它会照顾。
还有其他更聪明,更优化的方法吗?
答案 0 :(得分:2)
一种方法:
CREATE PROC dbo.DropBackupTables
AS
DECLARE @DropScript nvarchar(MAX) = (
SELECT N'DROP TABLE ' + QUOTENAME(OBJECT_SCHEMA_NAME(object_id)) + N'.' + QUOTENAME(name) + N';'
FROM sys.tables
WHERE
name LIKE N'%[_]TBR[_][2][0-9][0-9][0-9][0-1][0-9][0-3][0-9]'
AND RIGHT(name, 8) <= CONVERT(char(8), GETDATE(), 112)
FOR XML PATH('')
);
EXEC sp_executesql @DropScript;
GO
答案 1 :(得分:0)
对我而言,就像你过度复杂化一样
我只是在数据库中添加另一个表,而不是重命名表和使用游标,包含需要删除的表的名称以及删除的日期。
然后我将使用存储过程创建一个动态sql来实际删除这些表
这样的事情可以解决问题:
CREATE TABLE TablesToDrop
(
Table_Name sysname PRIMARY KEY,
Delete_Date date
)
CREATE PROCEDURE DropTables
AS
BEGIN
DECLARE @Sql varchar(max) = ''
SELECT @Sql = @Sql + 'DROP TABLE '+ Table_Name +';'
FROM TablesToDrop
WHERE Delete_Date <= GETDATE()
EXEC(@Sql)
END
注意#1:要非常小心谁将要向此表插入记录。
注意#2:要删除的最后一个表是TablesToDrop表......