我有一组名称类似于“somename_%”的存储过程。有没有办法通过一个查询来删除该 SP,例如
DROP PROCEDURE 名称如下 '某个名字_%'
.
在最新版本中,您可以使用
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)')
可以通过查询数据字典来生成DDL。例如,在 Oracle 中:
SELECT 'DROP PROCEDURE "'||owner||'"."'||object_name||'";'
FROM all_procedures
WHERE procedure_name IS NULL
AND lower(object_name) LIKE 'somename_%';
我总是倾向于做这些事情的方式就是使用我的标准从系统表中提取列表过程,然后创建命令列表 - 或者直接在 sql 中创建,例如
SELECT 'DROP PROCEDURE ' + procName FROM system_procedures_table WHERE procName like...
或在 Excel 中。
在 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;