【问题标题】:Delete all Stored Procedures at once一次删除所有存储过程
【发布时间】:2013-01-20 12:42:02
【问题描述】:

我的 Sql server 2008 R2 数据库中有 200 个 Stored Procedures 由应用程序自动生成。现在我想删除它们全部并重新生成它们,因为这些表发生了很大变化。

This question is very similar to my case 但在我的情况下,所有 SP 都以 sp_ 开头,我认为使用相同的代码很危险,因为系统 SP 也以 sp_ 开头 我可能会杀了他们。

我应该相信the link above 中的解决方案吗?如果没有,有没有更安全的解决方案?

【问题讨论】:

  • sp_ 自动生成扩展名是.sys,而您创建的sp_.dbo,如果正确的话。所以提示是获取所有.dbo 扩展并将其删除:)

标签: sql stored-procedures sql-server-2008-r2


【解决方案1】:

如果这是一次性任务,只需打开对象资源管理器,展开您的数据库 > 可编程性并突出显示存储过程节点。然后打开对象资源管理器详细信息(我认为是 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 +=),非常聪明。
  • 正在寻找这样的解决方案。我确实对查询进行了一些调整。声明 \@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 模式。我还添加了一个过滤器以避免删除系统存储过程。尽管在我的情况下我不需要它,但还有一个限制模式的标准。
【解决方案2】:
-- 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 

【讨论】:

    【解决方案3】:

    我发现了这个How to Drop All Stored Procedures in Your Database,然后我进行了测试,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
    

    【讨论】:

      【解决方案4】:
      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
      

      【讨论】:

        【解决方案5】:
        DECLARE @sql VARCHAR(MAX)='';
        
        SELECT @sql=@sql+'drop procedure ['+name +'];' FROM sys.objects 
        WHERE type = 'p' AND  is_ms_shipped = 0
        
        exec(@sql);
        

        【讨论】:

          猜你喜欢
          • 2012-07-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-06-03
          • 2014-01-10
          • 2014-03-22
          • 2010-10-04
          相关资源
          最近更新 更多