T-SQL丢弃多个表

时间:2016-01-10 23:00:43

标签: 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 
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,Level 16,State 62,Line 15
  找不到存储过程'drop table calendar'。

有什么想法吗?

3 个答案:

答案 0 :(得分:3)

我想你错过了一些括号:

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

答案 1 :(得分:1)

我不会使用CURSOR来执行此操作。

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

注意:如果在表之间定义了foreign Keys,则必须在删除表之前将其禁用。此外,如果存在任何模式绑定对象,则再次无法删除表。

运行以下查询以停用数据库中存在的所有foreign keys

EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"

了解更多信息check here

答案 2 :(得分:0)

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

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

EXEC sp_executesql @tablecommand

参考文献:

sp_executesql https://msdn.microsoft.com/en-us/library/ms188001.aspx

EXECUTE https://msdn.microsoft.com/en-us/library/ms188332.aspx