我想编写存储过程并将其存储在SQL Server数据库中。无论依赖性约束如何,该过程都应该删除所有表。
CREATE PROCEDURE sp_clear_db AS
BEGIN
EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL';
EXEC sp_MSForEachTable 'DROP TABLE ?';
END
但是,当我调用sp_helptext @objname = 'dbo.sp_clear_db'
时,只会显示第一个exec语句。我假设为了执行第一个函数,必须调用GO
。但是GO
作为存储过程定义的一部分也不会起作用。有谁知道解决这个问题的方法?也许还有另一个更好的选择来实现同样的目标......
干杯, 最大
答案 0 :(得分:4)
您不能在存储过程中使用“GO”。 (http://msdn.microsoft.com/en-us/library/ms188037.aspx)SQL查询分析器使用GO将语句分成“批处理”,然后将其发送到SQL服务器。因此,您需要进行两次单独的调用,一次用于ALTER调用,另一次用于DROP。
理想情况下,您只需调用“DROP DATABASE”,除非您尝试保留存储过程,然后重新创建表。
另一种解决方案是使用游标循环遍历sys.tables中的每一行,其中type ='U'并生成一些动态sql以删除约束并删除表。
答案 1 :(得分:1)
不要使用sp_helptext。使用OBJECT_DEFINITION或sys.sql_modules