如何以编程方式删除表格
如何以编程方式删除表格
我想以程序方式删除一些可能存在的表。目标是一个定时作业。我可以通过将其放入SP中使其成为手动过程,但我相信在可能的情况下自动化更好。我找到了这个How to drop tables based on sys.objects?但我无法弄清楚如何使它工作。它只删除了一张表。
我正在使用SQL Server 2005。
这是我基于上述链接尝试的方法:
DECLARE @sql NVARCHAR(MAX); SELECT @sql = N'DROP TABLE ' + QUOTENAME(SCHEMA_NAME([schema_id])) + '.' + QUOTENAME(name) + ';' FROM sys.tables WHERE create_date < dateadd(d, -7, getdate()) and [name] like 'tmpTableDump%'; EXEC sp_executesql @sql;
我从未创建过定时作业,但我认为一旦我得到正确的代码,我应该能够做到。我不是DBA而是应用程序员。
WBratz提供了解决方案。以下是完整的答案:
DECLARE @sql NVARCHAR(MAX) DECLARE @count int SELECT @count = COUNT(*) from sys.tables where create_date < dateadd(d, -7, getdate()) and [name] like 'tmpTableDump%' WHILE @COUNT > 0 BEGIN SELECT @sql = N'DROP TABLE ' + QUOTENAME(SCHEMA_NAME([schema_id])) + '.' + QUOTENAME(name) + ';' FROM sys.tables WHERE create_date < dateadd(d, -7, getdate()) and [name] like 'tmpTableDump%' EXEC sp_executesql @sql; SET @count = (SELECT (@count - 1)) END
admin 更改状态以发布 2023年5月23日
这是因为每次只能将一个值放入@sql中,所以需要循环执行,类似于
select COUNT(*)
from sys.tables
where create_date < dateadd(d, -7, getdate()) and [name] like '%whatever%'
然后循环执行,知道计数为0为止,每次减去一个值,类似于
DECLARE @count int = select COUNT(*) from sys.tables where create_date < dateadd(d, -7, getdate()) and [name] like '%whatever%' DECLARE @sql NVARCHAR(MAX) WHILE @COUNT > 0 BEGIN SELECT @sql = N'DROP TABLE ' + QUOTENAME(SCHEMA_NAME([schema_id])) + '.' + QUOTENAME(name) + ';' FROM sys.tables WHERE create_date < dateadd(d, -7, getdate()) and [name] like '%whatever%' EXEC sp_executesql @sql; SET @count = (SELECT (@count - 1)) END
可能不完全正确,但这就是为什么只会删除一个值,你似乎很聪明,可以看出我的可能的语法错误并得到正确答案。