dg9*_*g90 7 t-sql sql-server stored-procedures
我有数百个由DataSync自动生成的程序.
我没有时间和感觉手动删除它们.
他们都从一开始 DataSync.
有没有办法删除名称以DataSync.?开头的所有存储过程?
Jon*_*ton 22
使用information_schema.routines(它在诸如MSSQL,Mysql之类的RDBMS中是相当标准的):
如果你的proc名称开始"DataSync".然后他们可能在一个模式中,所以你可以找到它们:
select
'DROP PROCEDURE [' + routine_schema + '].[' + routine_name + ']'
from
information_schema.routines where routine_schema = 'DataSync' and routine_type = 'PROCEDURE'
Run Code Online (Sandbox Code Playgroud)
如果你的proc名称开始"DataSync",你可以找到它们:
select
'DROP PROCEDURE [' + routine_schema + '].[' + routine_name + ']'
from
information_schema.routines where routine_name like 'DataSync%' and routine_type = 'PROCEDURE'
Run Code Online (Sandbox Code Playgroud)
如果要执行所有这些drop语句,可以使用FOR XML PATH构建单个执行,如下所示:
declare @sql varchar(max)
set @sql = (
select
'DROP PROCEDURE [' + routine_schema + '].[' + routine_name + '] '
from
information_schema.routines where routine_schema = 'DataSync' and routine_type = 'PROCEDURE'
FOR XML PATH ('')
)
exec (@sql)
Run Code Online (Sandbox Code Playgroud)
假设您在指定"SQL"时表示SQL Server - 那么最简单的方法是:运行此查询:
SELECT
name,
DropCmd = 'DROP PROCEDURE DataSync.' + name
FROM sys.procedures
WHERE
schema_id = SCHEMA_ID('DataSync')
Run Code Online (Sandbox Code Playgroud)
甚至"懒惰"版本将使用光标自动为您执行此操作:
DECLARE DropSpCursor CURSOR FAST_FORWARD FOR
SELECT
name
FROM sys.procedures
WHERE schema_id = SCHEMA_ID('DataSync')
DECLARE @StoredProcName sysname
DECLARE @DropStatement NVARCHAR(1000)
OPEN DropSpCursor
FETCH NEXT FROM DropSpCursor INTO @StoredProcName, @SchemaName
WHILE (@@fetch_status <> -1)
BEGIN
IF (@@fetch_status <> -2)
BEGIN
SET @DropStatement = N'DROP PROCEDURE DataSync.' + @StoredProcName
EXEC(@DropStatement)
END
FETCH NEXT FROM DropSpCursor INTO @StoredProcName
END
CLOSE DropSpCursor
DEALLOCATE DropSpCursor
Run Code Online (Sandbox Code Playgroud)