一次性删除所有存储过程

9
我在我的Sql server 2008 R2数据库中有200个由应用程序自动生成的Stored Procedures。现在我想要删除它们全部,然后重新生成它们,因为表已经发生了很多变化。 这个问题与我的情况非常相似但在我的情况下,所有SP都以sp_开头,我认为使用相同的代码是危险的,因为系统SP也以sp_开头,我可能会将它们全部删除。
我应该信任上面链接中的解决方案吗?如果不是,有更安全的解决方案吗?

1
但是自动生成的 sp_ 的扩展名是 .sys,而您创建的 sp_ 的扩展名是 .dbo,如果我没记错的话。所以提示是获取所有的 .dbo 扩展名并将其删除 :) - spajce
5个回答

24
如果这是一次性任务,只需打开“对象资源管理器”,展开您的数据库 > 可编程性并突出显示存储过程节点。然后打开“对象资源管理器详细信息”(我认为是F7)。在右侧,您应该可以看到您的列表,您可以进行多选 - 因此,您可以按名称排序,选择所有以sp_开头的过程,并用一个按键删除它们全部。
如果您需要经常执行此操作(假设您的过程都在dbo模式中):
DECLARE @sql NVARCHAR(MAX) = N'';

SELECT @sql += N'DROP PROCEDURE dbo.'
  + QUOTENAME(name) + ';
' FROM sys.procedures
WHERE name LIKE N'sp[_]%'
AND SCHEMA_NAME(schema_id) = N'dbo';

EXEC sp_executesql @sql;

能够使用单个 SELECT 加上 EXEC 而不必声明 CURSOR 并进行迭代真的很方便。我不知道 T-SQL 允许你以这种方式构建字符串 (SELECT @sql +=),非常聪明。 - JonBrave
正在寻找这样的解决方案。 我对查询进行了一些微调。DECLARE @sql NVARCHAR(MAX) = N'';SELECT @sql += N'DROP PROCEDURE [' + SCHEMA_NAME(p.[schema_id]) + '].' + QUOTENAME(p.[name]) + ';' FROM sys.procedures p WHERE p.is_ms_shipped = 0 --AND SCHEMA_NAME(p.[schema_id]) IN (N'dbo')EXEC sp_executesql @sql;该查询不再是硬编码到dbo模式中。 我还添加了一个过滤器以避免删除系统存储过程。 还有一个限制模式的条件,尽管在我的情况下我不需要它。 - Kenneth Lauritsen

1
-- drop all user defined stored procedures

    Declare @procName varchar(500) 
    Declare cur Cursor For Select [name] From sys.objects where type = 'p' 
    Open cur 
    Fetch Next From cur Into @procName 
    While @@fetch_status = 0 
    Begin 
     Exec('drop procedure ' + @procName) 
     Fetch Next From cur Into @procName 
    End
    Close cur 
    Deallocate cur 

0
DECLARE @sql VARCHAR(MAX)='';

SELECT @sql=@sql+'drop procedure ['+name +'];' FROM sys.objects 
WHERE type = 'p' AND  is_ms_shipped = 0

exec(@sql);

0

我发现了这个如何删除数据库中的所有存储过程,然后我测试了一下,StoredProcedure被创建在Stored Procedures文件夹之外。

CREATE PROC UserStoredProcedure_Sample1
 AS
       SELECT 'SQL Server rocks'
  GO

CREATE PROC UserStoredProcedure_Sample2
 AS
     SELECT 'SQL Server rocks'
 GO

 SET NOCOUNT ON

  -- to do this we have to use EXEC instead of sp_executesql
 -- sp_executesql does not accept a DROP command in the SQL String
 DECLARE @UserStoredProcedure    VARCHAR(100)
 DECLARE @Command                    VARCHAR(100)

 DECLARE UserStoredProcedureCursor CURSOR SCROLL STATIC READ_ONLY FOR
 SELECT
     SPECIFIC_NAME
 FROM
    INFORMATION_SCHEMA.ROUTINES

  OPEN UserStoredProcedureCursor

FETCH NEXT FROM UserStoredProcedureCursor
 INTO @UserStoredProcedure
  WHILE (@@FETCH_STATUS = 0) BEGIN
        SET @Command = 'DROP PROCEDURE ' + @UserStoredProcedure

         -- display; visual check
         SELECT @Command

        -- when you are ready to execute, uncomment below
        EXEC (@Command)

        FETCH NEXT FROM UserStoredProcedureCursor
         INTO @UserStoredProcedure
  END


 CLOSE UserStoredProcedureCursor
 DEALLOCATE UserStoredProcedureCursor

   SET NOCOUNT OFF

0
DECLARE @DeleteProcCommand NVARCHAR(500)

DECLARE Syntax_Cursor CURSOR
FOR
SELECT 'DROP PROCEDURE ' + p.NAME
FROM sys.procedures p

OPEN Syntax_Cursor

FETCH NEXT FROM Syntax_Cursor

INTO @DeleteProcCommand

WHILE (@@FETCH_STATUS = 0)
BEGIN

EXEC (@DeleteProcCommand)

FETCH NEXT FROM Syntax_Cursor
INTO @DeleteProcCommand

END

CLOSE Syntax_Cursor

DEALLOCATE Syntax_Cursor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接