我正在使用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'。
有什么想法吗?
答案 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