繁体   English   中英

如何在SQL Server中删除具有特定名称的表?

[英]How to delete tables with specific names in SQL Server?

老师请帮我。

我有一个称为ABC的主表,每个月我们都会创建新的表和后缀,分别是月份和年份ABC_012010ABC_022010

我必须将这些表保留7年,并删除超过7年的任何表。

因此作业将在2017年2月删除ABC_012010在2017年3月删除ABC_022010 ,依此类推

作业每月运行一次,以检查和删除任何符合条件的表。

尝试 :您需要dynamic query, loop and temporary tables来执行此操作,并且表格式必须与示例中提到的格式相同。 您可以通过这种方式在多个表中执行INSERT, UPDATE, DELETE, DROP, TRUNCATE

    --Selecting table name in date format with `LEFT` `RIGHT` function
SELECT name, 
    CAST(CONCAT(LEFT(RIGHT(name, 6), 2), '-01-', RIGHT(RIGHT(name, 6), 4)) AS DATE) AS tableDate, 
    CAST(GETDATE() AS DATE) AS currentDate
INTO #tmp_date 
FROM sys.objects 
WHERE TYPE = 'u' AND NAME LIKE 'ABC[_]%'

--Storing table names that are older than 7 years from current date
SELECT id = IDENTITY(INT, 1, 1), 
    NAME 
INTO #object_name FROM #tmp_date 
WHERE (DATEDIFF(MM,tableDate, currentDate)-1) > = 84 

DECLARE @i INT = 1, @j INT, @sql VARCHAR(500), @object_name VARCHAR(100)

SELECT @j = MAX(id) FROM #object_name

WHILE @i < = @j 
BEGIN
    SELECT @object_name = NAME FROM #object_name WHERE id = @i
    SET @sql = 'DELETE FROM ' + @object_name --can use `DROP` to drop the table
    EXEC (@sql)

    SET @i = @i+1

END

尝试以下方法:

IF OBJECT_ID('TEMPDB.DBO.#TEMP_DEL', 'U') IS NOT NULL
    DROP TABLE #TEMP_DEL
DECLARE @CYMO VARCHAR(8) = (SELECT '01' + RIGHT(REPLACE(CONVERT(CHAR(10), DATEADD(YY, -7, GETDATE()), 103), '/', ''), 6))
SELECT [NAME] TABLE_NAME INTO #TEMP_DEL FROM DBNAME.SYS.TABLES
WHERE [NAME] LIKE 'ABC%' AND '01'+RIGHT(NAME,6) < @CYMO
WHILE ((SELECT COUNT(1) FROM #TEMP_DEL) > 0)
BEGIN
    DECLARE @TAB VARCHAR(100) = (SELECT TOP 1 TABLE_NAME FROM #TEMP_DEL)
    DECLARE @CMD NVARCHAR(200) = 'DROP TABLE '+@TAB
    EXEC SP_EXECUTESQL @CMD
    DELETE #TEMP_DEL WHERE TABLE_NAME = @TAB
END

用您的数据库名称替换DBNAME

HTH!

谢谢。

您可以使用dynamic query, while and if conditionals (如您所愿)构造一个存储过程或计划的作业来解决此问题。 尝试这个。

CREATE PROCEDURE dbo.delete_abc @Date date, @years_diff int
AS 
    --- Declare variables to use
    DECLARE @sqlCommand varchar(30)
    DECLARE @table varchar(20)
    DECLARE @month int
    DECLARE @year int

    --- Temporary table with 'ABC_'s table names
    SELECT TABLE_NAME
    INTO #Temp
    FROM INFORMATION_SCHEMA.TABLES 
    WHERE TABLE_NAME LIKE 'ABC_%'
    AND TABLE_TYPE='BASE TABLE' -- If you want only tables

    ---- While there are tables to compare
    WHILE EXISTS(SELECT * FROM #Temp)
    BEGIN
        --- Extract Month and Year of the first row in 'ABC_'s table
        SET @month = (SELECT TOP 1 SUBSTRING(TABLE_NAME,5,2) FROM #Temp)
        SET @year = (SELECT TOP 1 SUBSTRING(TABLE_NAME,7,4) FROM #Temp)

        --- Compare if date difference of the table is more than @years_diff years from @Date
        IF DATEDIFF(YEAR, CAST(CAST(@year AS VARCHAR) + '-' + CAST(@month AS VARCHAR) + '-01' AS DATE), DATEADD(MONTH, DATEDIFF(MONTH, 0, @Date), 0)) > @years_diff 
            BEGIN
            --- Construct and execute delete query
            SET @table = (SELECT TOP 1 TABLE_NAME FROM #Temp)
            SET @sqlCommand = 'DROP TABLE ' + @table  --- or 'DELETE FROM ' if you only want to delete all rows from table
            EXEC(@sqlCommand)
            END

     --- Delete first row of 'ABC_'s tables in temporary
     DELETE TOP (1) FROM #Temp;

     END

     --- Drop temporary table
     DROP TABLE #Temp
GO;

创建完成后,您可以使用此存储过程,也可以将其与您喜欢的参数一起使用:

DECLARE @Now date
SET @Now = GETDATE()
EXEC dbo.delete_abc @years_diff = 7, @Date = @Now

进行删除查询是否足够容易?

Delete From [Your_Table] Where [Date_Column] = 'ABC_012010' 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM