[英]How to delete tables with specific names in SQL Server?
老师请帮我。
我有一个称为ABC
的主表,每个月我们都会创建新的表和后缀,分别是月份和年份ABC_012010
, ABC_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.