如果数据库中存在动态表,则删除该表

时间:2017-11-16 11:30:39

标签: sql sql-server sql-server-2008

我有一个表,每个月1日动态创建。比如11月的test201711。

我想检查DB Drop test201711中是否存在test201711

到目前为止我尝试了什么:

Declare @ste varchar(max)
set @ste = 'if exists (select * from INFORMATION_SCHEMA.TABLES where   TABLE_NAME =''test'+CONVERT(varchar(6),getdate(),112) + ''');'  + ' Drop table test'+ CONVERT(varchar(6),getdate(),112)
print @ste   
exec(@ste)

当我打印查询时它是正确的,但是当我执行它时会给我一个错误。

我的代码在这里出了什么问题?

2 个答案:

答案 0 :(得分:2)

简单地使用这样的。它对我有用。

-- Create the table for testing
CREATE TABLE Test201711
(
    id INT
)

SELECT NAME
FROM   sys.tables AS t
WHERE  t.name = 'Test201711'

DECLARE @TableName VARCHAR(100) = 'Test' + CONVERT(VARCHAR(6), GETDATE(), 112)

IF OBJECT_ID(@TableName) IS NOT NULL
    EXEC ('DROP Table ' + @TableName)

SELECT NAME
FROM   sys.tables AS t
WHERE  t.name = 'Test201711'

答案 1 :(得分:0)

我猜这个问题是分号。

Declare @ste nvarchar(max);
set @ste = '
if exists (select *
           from INFORMATION_SCHEMA.TABLES
           where TABLE_NAME = ''[tablename]''
          )
     Drop table [tablename]
';
set @ste = replace(@ste, '[tablename]', CONVERT(varchar(6), getdate(), 112));
print @ste  

exec sp_executesql @ste;

注意:

  • 这会构造一次表名,然后使用replace()将其放入查询字符串中。
  • if末尾的分号已删除。
  • 使用sp_executesql。它比exec()强大得多,即使参数在这种情况下没用。

您也可以使用try / catch块执行此操作:

begin try
    drop table [tablename]
end try
begin catch
    -- assume table doesn't exist and ignore error
end catch;