按名称删除一组存储过程

12

我有一组以“somename_%”命名的存储过程。是否有一种方法可以使用一个查询来删除这些存储过程,例如:

DROP PROCEDURE where name like 'somename_%'

5个回答

14

这适用于 MSSQL 2005 及以上版本。

DECLARE @DropScript varchar(max)
set @DropScript = ''

SELECT @DropScript = @DropScript + 'DROP PROCEDURE [' + schema_name(schema_id)+ '].' + '[' + name + ']
' FROM sys.procedures
where name like 'somename_%'


exec (@DropScript)

它对我也非常有效。从一个糟糕的程序安装中清除了大约200个SP!谢谢! - Teo

2

你可以通过查询数据字典来生成DDL。例如,在Oracle中:

SELECT 'DROP PROCEDURE "'||owner||'"."'||object_name||'";'
FROM all_procedures
WHERE procedure_name IS NULL
AND lower(object_name) LIKE 'somename_%';

0
在MS_Sql-Server中,您可以创建一个带有所有相关过程的语句,通过滥用“FOR XML PATH ('')”子句来删除它们...
BEGIN TRANSACTION;
GO
CREATE PROC Test_1  AS
BEGIN;
  PRINT '1'
END;
GO
CREATE PROC Test_2  AS
BEGIN;
  PRINT '2'
END;
GO
SELECT * FROM sys.objects WHERE name LIKE 'Test%'  AND   TYPE = 'P';
DECLARE @Stmt NVARCHAR(MAX);
SET @Stmt = ( SELECT 'DROP PROC ' + STUFF (x.Stmt, 1, 2, SPACE(0))
              FROM  (SELECT ', ' + SCHEMA_NAME(Obj.Schema_ID) + CHAR(46) + Obj.Name
                     FROM   sys.objects AS Obj
                     WHERE  Obj.name LIKE 'Test%' 
                      AND   obj.TYPE = 'P'
                     FOR XML PATH ('')
                    ) AS X (Stmt)
            );
SELECT @Stmt;
EXEC sp_ExecuteSQL @Stmt;
SELECT * FROM sys.objects WHERE name LIKE 'Test%'  AND   TYPE = 'P';
ROLLBACK;

0
我通常处理这类事情的方式是从系统表中提取列表过程,使用我的标准创建命令列表 - 直接在 SQL 中创建,例如 SELECT 'DROP PROCEDURE ' + procName FROM system_procedures_table WHERE procName like... 或者在 Excel 中创建。

0

请注意,仅链接答案是不被鼓励的,SO答案应该是寻找解决方案的终点(而不是另一个参考站点,随着时间的推移往往会变得陈旧)。请考虑在此处添加独立的摘要,将链接作为参考。 - kleopatra

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