【问题标题】:How to drop tables programmatically如何以编程方式删除表
【发布时间】:2015-12-19 01:19:39
【问题描述】:

我想以编程方式删除一些可能存在或不存在的表。目标是预定的工作。我可以通过将其放入 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 

【问题讨论】:

标签: tsql


【解决方案1】:

这是因为一次只能将一个值放入@sql,所以你需要循环这个,所以像 选择计数(*) 来自 sys.tables 其中 create_date

然后循环计算每次减一的次数,例如

 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 

可能不完全正确,但这就是为什么它只删除一个,而你看起来很聪明,可以看到我可能的语法错误来纠正它

【讨论】:

    猜你喜欢
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-16
    • 2013-12-22
    • 2011-04-24
    • 1970-01-01
    相关资源
    最近更新 更多