按名称删除存储过程组

问题描述 投票:0回答:5

我有一组名称类似于“somename_%”的存储过程。有没有办法通过一个查询来删除该 SP,例如

DROP PROCEDURE 名称如下 '某个名字_%'

.

sql t-sql stored-procedures
5个回答
15
投票

在最新版本中,您可以使用

STRING_AGG

DECLARE @DropScript nvarchar(max)

SELECT @DropScript = STRING_AGG('DROP PROCEDURE ' + QUOTENAME(schema_name(schema_id)) + '.' + QUOTENAME(name) + ';', CHAR(10))
FROM sys.procedures
WHERE name like 'somename_%'

PRINT @DropScript

--Uncomment the line below if you are happy with the PRINT output and want the script executed
--EXEC (@DropScript)

在旧版本上,您可以使用以下内容代替

STRING_AGG
来执行脚本

SET @DropScript = 
(
SELECT 'DROP PROCEDURE ' + QUOTENAME(schema_name(schema_id)) + '.' + QUOTENAME(name) + ';
'
FROM sys.procedures
WHERE name like 'somename_%'
FOR XML PATH(''), TYPE
).value('.', 'nvarchar(max)')

2
投票

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

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

0
投票

我总是倾向于做这些事情的方式就是使用我的标准从系统表中提取列表过程,然后创建命令列表 - 或者直接在 sql 中创建,例如

SELECT 'DROP PROCEDURE ' + procName FROM system_procedures_table WHERE procName like...
或在 Excel 中。


0
投票

在 MS_Sql-Server 中,您可以使用“FOR XML PATH ('')”子句创建一个包含所有相关过程的语句,以通过 (ab) 删除...

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;

© www.soinside.com 2019 - 2024. All rights reserved.