Sql 一次删除所有存储过程

Sql 一次删除所有存储过程,sql,stored-procedures,sql-server-2008-r2,Sql,Stored Procedures,Sql Server 2008 R2,我的Sql server 2008 R2数据库中有200个存储过程,它们是由应用程序自动生成的。现在我想删除它们全部并重新生成它们,因为表发生了很大变化 但在我的例子中,所有SP都以SP_开头,我认为使用相同的代码是危险的,因为系统SP也以SP_开头,我可能会将它们全部杀死 我应该相信解决方案吗?如果没有更安全的解决方案?如果这是一次性任务,只需打开对象资源管理器,展开数据库>可编程性并突出显示存储过程节点。然后打开对象资源管理器详细信息(我想是F7)。在右边,你应该看到你的列表,在这里你可以多

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

但在我的例子中,所有SP都以SP_开头,我认为使用相同的代码是危险的,因为系统SP也以SP_开头,我可能会将它们全部杀死


我应该相信解决方案吗?如果没有更安全的解决方案?

如果这是一次性任务,只需打开对象资源管理器,展开数据库>可编程性并突出显示存储过程节点。然后打开对象资源管理器详细信息(我想是F7)。在右边,你应该看到你的列表,在这里你可以多选-这样你就可以按名称排序,选择所有以sp_开头的过程,然后一键删除它们

如果重复执行此操作,则(假设您的过程都在dbo模式中):

我发现了这一点,然后进行了测试,
StoredProcedure
是在存储过程文件夹外部创建的


但是自动生成扩展名的
sp_
.sys
,如果正确,则创建的
sp_
.dbo
。因此,提示是获取所有的
.dbo
扩展名并将其删除:)能够使用单个
SELECT
plus
EXEC
而不必声明
游标
并进行迭代,这真的很好。我不知道T-SQL允许您以这种方式构建字符串(
SELECT@SQL+=
),非常聪明。我们正在寻找这样的解决方案。我确实对查询做了一些调整。声明\@sql NVARCHAR(MAX)=N';选择\@sql+=N'DROP PROCEDURE['+SCHEMA_NAME(p.[SCHEMA_id])+'.+QUOTENAME(p.[NAME])+';'来自sys.procedures p,其中p.is_ms_shipped=0——以及(N'dbo')EXEC sp_executesql\@sql中的SCHEMA_NAME(p.[SCHEMA_id]);查询不再硬编码到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;
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
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
DECLARE @sql VARCHAR(MAX)='';

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

exec(@sql);
-- 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