是否有办法根据修改日期每周或每月自动删除表格?经过对该网站的一些研究后,我发现了一个脚本并将其修改为以下内容。
select
'drop table Update_Backups.[' + s.name +'].[' + t.name +']' , t.modify_date
from
Update_Backups.sys.tables t
inner join
Update_Backups.sys.schemas s
on
s.schema_id = t.schema_id
where
modify_date < DATEADD(year,-01, GETDATE())
不幸的是它仍然有一个手动元素,因为我必须复制结果并运行它们。我希望这是完全自动化的,但我的技能不能达到那么远。
答案 0 :(得分:1)
我认为游标上没有任何真正的优势,因为主要成本是执行语句,而不是构建它,但是你可以使用SQL Server的XML扩展组合你的语句,然后使用{ {1}}执行它们:
sp_executesql
N.B。我假设您正在使用基于目录视图DECLARE @SQL NVARCHAR(MAX) = (SELECT 'DROP TABLE Update_Backups.' +
QUOTENAME(SCHEMA_NAME(t.schema_id)) + '.' +
QUOTENAME(OBJECT_NAME(t.object_id)) + ';
'
FROM sys.tables t
WHERE t.modify_date < DATEADD(year,-01, GETDATE())
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)');
PRINT @SQL -- FOR DEBUGGING YOU CAN CHECK THE STATEMENT ABOUT TO BE EXECUTED
EXECUTE sp_executesql @SQL;
修改强>
更新了SQL Server 2005的语法:
sys.tables
答案 1 :(得分:0)
您可以在值
上尝试光标DECLARE @table VARCHAR(100),@sql VARCHAR(MAX)
DECLARE CURSOR_TB CURSOR FOR
SELECT DISTINCT t.name
FROM Update_Backups.sys.tables t
JOIN Update_Backups.sys.schemas s
ON s.schema_id = t.schema_id
WHERE modify_date < DATEADD(year,-01, GETDATE())
OPEN CURSOR_TB
FETCH NEXT FROM CURSOR_TB INTO @table
WHILE @@FETCH_STATUS=0
BEGIN
IF OBJECT_ID(@table) is not null
BEGIN
SET @sql = 'DROP TABLE ' + @table
EXEC (@sql)
END
FETCH NEXT FROM CURSOR_TB INTO @table
END
CLOSE CURSOR_TB
DEALLOCATE CURSOR_TB