Sql server 多重进入存储过程

Sql server 多重进入存储过程,sql-server,tsql,stored-procedures,transactions,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\u helptext@objname='dbo.sp\u clear\u db'时,只

我想编写一个存储过程并将其存储在SQL Server数据库中。该过程应该删除所有表,而不考虑依赖项约束

CREATE PROCEDURE sp_clear_db AS
BEGIN
EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL';
EXEC sp_MSForEachTable 'DROP TABLE ?';
END
但是,当我调用
sp\u helptext@objname='dbo.sp\u clear\u db'
时,只显示第一条exec语句。我假设为了执行第一个函数,必须调用
GO
。但是作为存储过程定义的一部分的
GO
也不起作用。有人知道解决这个问题的方法吗?也许有另一个更好的选择来实现同样的目标

干杯,
Max

不要使用sp\u帮助文本。使用或不使用sp\U帮助文本。使用或存储过程中不能有“GO”。()SQL查询分析器使用GO将语句分成“批”,然后将这些“批”发送到SQL server。因此,您需要进行两个单独的调用,一个用于ALTER调用,另一个用于DROP

理想情况下,您只需调用“DROP DATABASE”,除非您试图保留存储的进程,然后重新创建表

另一种解决方案是使用游标在sys.tables中的每一行循环,其中type='U',并生成一些动态sql以删除约束并删除表。

存储过程中不能有“GO”。()SQL查询分析器使用GO将语句分成“批”,然后将这些“批”发送到SQL server。因此,您需要进行两个单独的调用,一个用于ALTER调用,另一个用于DROP

理想情况下,您只需调用“DROP DATABASE”,除非您试图保留存储的进程,然后重新创建表


另一种解决方案是使用游标在sys.tables中的每一行循环,其中type='U',并生成一些动态sql以删除约束并删除表。

是否删除所有表?为什么不直接删除数据库呢?因为运行代码的应用程序已连接到该数据库。任何改变都是不切实际的。什么样的疯狂应用程序需要删除所有表??因此,断开并重新连接。有什么大不了的?也许你应该解释一下为什么你需要删除所有的表(也就是说,不要向别人寻求关于一个可感知的解决方案的帮助),另一种解决问题的方法是将
create database xx
添加到测试套件的设置中,并在测试完成时删除数据库。删除所有的表吗?为什么不直接删除数据库呢?因为运行代码的应用程序已连接到该数据库。任何改变都是不切实际的。什么样的疯狂应用程序需要删除所有表??因此,断开并重新连接。有什么大不了的?也许你应该解释一下为什么你需要删除所有的表(也就是说,不要向别人求助于你认为的解决方案),另一种解决问题的方法是将
create database xx
添加到测试套件的设置中,并在测试完成后删除数据库。