2010-03-15 103 views
5

我有一组名称为“somename_%”的存储过程。是否有任何的方式来删除SP有一个查询,forexample按名称删除存储过程组

DROP PROCEDURE其中名称一样 'somename_%'

+3

您使用的数据库是? – hallie 2010-03-15 09:17:31

回答

8

这适用于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) 
+0

它很棒! – Kate 2010-03-15 09:29:06

+0

好东西。也许它会有点整齐使用QUOTENAME函数而不是连接,但很高兴它可以工作! – 2010-03-15 09:33:17

0

的方式,我总是倾向于做这类事情用我的critierion只是提取系统表列表中的程序,然后创建命令列表 - 无论是直接在SQL中,例如SELECT 'DROP PROCEDURE ' + procName FROM system_procedures_table WHERE procName like...或在Excel中。

1

您可以通过查询数据字典来生成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 – Kate 2010-03-15 09:28:46

+0

对不起,我应该知道。 – 2010-03-16 00:28:45

0

在MS_SQL-Server,则创建cn的所有相关手续到(AB)放弃一个语句中使用 “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
+0

请注意,[只有链接的答案](http://meta.stackoverflow.com/tags/link-only-answers/info)不鼓励,所以答案应该是搜索解决方案的终点(vs.而另一个引用的中途停留时间往往会随着时间推移而过时)。请考虑在此添加独立的摘要,并将链接保留为参考。 – kleopatra 2014-02-12 11:02:40