存储过程中的多个Go

时间:2011-12-12 04:57:36

标签: sql-server tsql stored-procedures transactions

我想编写存储过程并将其存储在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作为存储过程定义的一部分也不会起作用。有谁知道解决这个问题的方法?也许还有另一个更好的选择来实现同样的目标......

干杯, 最大

2 个答案:

答案 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_DEFINITIONsys.sql_modules