删除表语句但不使用存储过程

时间:2013-04-23 03:55:49

标签: sql-server sql-server-2008

我正在尝试DROP表但我不想在存储过程中使用,我可以知道它可以在查询中工作吗?

declare @cmd varchar(4000)

declare cmds cursor for 
    select 'drop table [' + name + ']'
    from sys.objects
    where DATEDIFF(day,create_date,GETDATE()) = 26 AND schema_id = 1 AND type ='U'

open cmds
begin
    fetch cmds into @cmd
    if @@fetch_status != 0 break
    exec(@cmd)
end

close cmds;
deallocate cmds

1 个答案:

答案 0 :(得分:2)

您不必使用存储过程,甚至不能使用带有动态SQL的过程批处理。

只是一些手动步骤。运行此查询

select 'drop table [database].' + schema_name(schema_id) + '.' + quotename(name)
from [database].sys.objects

将结果复制到查询窗口并再次运行。例如,如果您使用的是.NET应用程序,则可以从此查询中获取结果,并将其作为下一个的CommandText发送。


如果没有CURSOR,您的动态SQL查询批处理写得更好,如下所示:

declare @cmd nvarchar(max) = '';
select @cmd = @cmd + 'drop table [database].' + schema_name(schema_id) + '.' + quotename(name) + ';'
from [database].sys.objects
where DATEDIFF(day,create_date,GETDATE()) = 26 AND schema_id = 1 AND type ='U';
exec (@cmd);

我认为我没有说清楚

您正在寻找的语法,如果我要补偿:

DROP TABLES
WHERE object_id IN (
    select object_id
    from [database].sys.tables 
    where DATEDIFF(day,create_date,GETDATE()) = 26 AND schema_id = 1 AND type ='U')

只是不存在。 DROP TABLE语法:

  

DROP TABLE [database_name。 [schema_name]。 | schema_name。 ]
         table_name [,... n] [; ]

没有任何动态能力的迹象。