如何以编程方式删除表格

13 浏览
0 Comments

如何以编程方式删除表格

我想以程序方式删除一些可能存在的表。目标是一个定时作业。我可以通过将其放入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日
0
0 Comments

这是因为每次只能将一个值放入@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 

可能不完全正确,但这就是为什么只会删除一个值,你似乎很聪明,可以看出我的可能的语法错误并得到正确答案。

0