根据修改日期自动删除表
Dropping tables automatically depending on modify date
有没有一种方法可以根据修改日期每周或每月自动删除表格?在对该站点进行一些研究后,我找到了一个脚本并将其修改为以下内容。
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())
不幸的是它仍然有一个手动元素,因为我必须复制结果并 运行 它们。我希望这是完全自动的,但我的技能还没有达到那种程度。
您可以尝试将光标置于值上
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
我认为这与游标相比没有任何真正的优势,因为主要成本是执行语句,而不是构建语句,但是您可以使用 SQL 服务器的XML 个扩展,然后使用 sp_executesql
执行它们:
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;
N.B。我假设您使用的是 SQL 服务器,基于对目录视图的使用 sys.tables
编辑
SQL Server 2005 的更新语法:
DECLARE @SQL NVARCHAR(MAX);
SET @SQL = (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;
有没有一种方法可以根据修改日期每周或每月自动删除表格?在对该站点进行一些研究后,我找到了一个脚本并将其修改为以下内容。
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())
不幸的是它仍然有一个手动元素,因为我必须复制结果并 运行 它们。我希望这是完全自动的,但我的技能还没有达到那种程度。
您可以尝试将光标置于值上
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
我认为这与游标相比没有任何真正的优势,因为主要成本是执行语句,而不是构建语句,但是您可以使用 SQL 服务器的XML 个扩展,然后使用 sp_executesql
执行它们:
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;
N.B。我假设您使用的是 SQL 服务器,基于对目录视图的使用 sys.tables
编辑
SQL Server 2005 的更新语法:
DECLARE @SQL NVARCHAR(MAX);
SET @SQL = (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;