需要删除表列表,并且应该在SQL SERVER中进行配置

时间:2015-06-14 14:46:10

标签: sql-server

作为新版本的一部分,我们偶尔会对几张表进行备份,然后在稳定期内将其删除。 我想让它可配置,即为要删除的表列表设置命名约定,然后在稳定期结束后删除它

这是我的计划。

  1. 重命名我要删除的所有表格,后缀为" _TBR" (待删除)。
  2. 添加yyyymmdd格式的后缀,例如。如果表的名称是EmployeeDetails,那么它将是EmployeeDetails_TBR_20150614。
  3. 因此,我将创建一个存储过程,它将选择所有具有 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()
    

    这将选择超出指定日期的所有表。 现在,声明一个游标,然后循环并删除它。

    我会安排一个工作每周运行一次这个存储过程,它会照顾。

    还有其他更聪明,更优化的方法吗?

2 个答案:

答案 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表......