如何以编程方式删除表

时间:2015-12-17 19:51:04

标签: tsql

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

1 个答案:

答案 0 :(得分:2)

因为一次只能将一个值放入@sql中,所以你需要循环它,所以就像    选择COUNT(*)    来自sys.tables    其中create_date&lt; dateadd(d,-7,getdate())和[name]喜欢&#39;%无论%&#39;

然后循环,无论多少计数每次减去一次,所以像

files:
  "/home/ec2-user/production.env":
    mode: "000644"
    owner: nodejs
    group: nodejs
    source: https://s3.amazonaws.com/bucket-name/file.env

container_commands:
  01_mv_to_app_dir:
    command: "mv /home/ec2-user/production.env ./production.env"

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