1

我正在尝试 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
4

1 回答 1

2

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

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

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

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


您的动态 sql 查询批处理最好在没有 CURSOR 的情况下编写,如下所示:

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')

只是不存在。删除表语法:

删除表[数据库名称。[模式名称]。| 模式名称。]
表名 [ ,...n ] [ ; ]

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

于 2013-04-23T04:07:40.040 回答