T-SQL删除多个表

T-SQL删除多个表,sql,sql-server,tsql,Sql,Sql Server,Tsql,我正在使用T-SQL脚本删除数据库中的所有约束和所有表,以便在执行时给我一个干净的记录,这似乎对约束很有效,但当调整段以清除表时,它会给我一条错误消息,代码如下: declare @tableCommand varchar(255) declare tableCursor cursor for select 'drop table '+ t.name from sys.tables t where t.type = 'U' open tableCursor fetc

我正在使用T-SQL脚本删除数据库中的所有约束和所有表,以便在执行时给我一个干净的记录,这似乎对约束很有效,但当调整段以清除表时,它会给我一条错误消息,代码如下:

declare @tableCommand varchar(255) 
declare tableCursor cursor for
    select 'drop table '+ t.name
    from sys.tables t
    where t.type = 'U'

open tableCursor 
fetch next from tableCursor into @tableCommand 

while @@fetch_status = 0 begin
    exec @tableCommand
    fetch next from tableCursor into @tableCommand
end 

close tableCursor 
deallocate tableCursor
正如我所说,一段类似的代码可以很好地去除我的约束,但通过这段代码,我只得到了一个错误:

Msg 2812,第16级,状态62,第15行
找不到存储过程“drop table calendar”


有什么想法吗?

我想你错过了一些括号:

while @@fetch_status = 0 begin
    exec (@tableCommand);
    fetch next from tableCursor into @tableCommand
end 

我想你错过了一些括号:

while @@fetch_status = 0 begin
    exec (@tableCommand);
    fetch next from tableCursor into @tableCommand
end 

T-SQL
EXEC
用于调用存储过程

要执行动态SQL,可以使用
sp_executesql
过程,例如

EXEC sp_executesql @tablecommand
参考资料:


T-SQL
EXEC
用于调用存储过程

要执行动态SQL,可以使用
sp_executesql
过程,例如

EXEC sp_executesql @tablecommand
参考资料:


我不会使用
光标来执行此操作

SELECT ' Drop table ' + s.NAME + '.' + t.NAME
FROM   sys.tables t
       JOIN sys.schemas s
         ON t.[schema_id] = s.[schema_id]
WHERE  t.type = 'U' 

Exec sp_executesql @sql
注意:如果在表之间定义了任何
外键
,则必须在删除表之前将其禁用。此外,如果存在任何绑定到模式的对象,则同样不能删除表

运行以下查询以禁用数据库中存在的所有外键

EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"

有关更多信息,我将不使用
光标

SELECT ' Drop table ' + s.NAME + '.' + t.NAME
FROM   sys.tables t
       JOIN sys.schemas s
         ON t.[schema_id] = s.[schema_id]
WHERE  t.type = 'U' 

Exec sp_executesql @sql
注意:如果在表之间定义了任何
外键
,则必须在删除表之前将其禁用。此外,如果存在任何绑定到模式的对象,则同样不能删除表

运行以下查询以禁用数据库中存在的所有外键

EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"

有关更多信息,请参见,但您可以使用EXEC的方式
EXEC('dynamicsql')如果将sql字符串括在括号中…EXEC用于存储过程,但可以将EXEC()用于命令。EXEC()是一个函数,不同于EXEC命令。但是您可以通过
EXEC('dynamic sql')的方式使用EXEC如果将sql字符串括在括号中…EXEC用于存储过程,但可以将EXEC()用于命令。EXEC()是一个函数,与EXEC命令不同。