如何在一个数据库中删除多个存储过程

4

我正在使用SQL Server 2008。我有一个名为Training的数据库,其中包含两种存储过程,名称前缀分别为SP_V400_spV400_。现在我需要删除名称前缀为spV400_的存储过程。

我尝试了这个命令:

SELECT 'DROP PROCEDURE [' + SCHEMA_NAME(p.schema_id) + '].[' + p.NAME + '] GO'
FROM sys.procedures p  
WHERE p.name LIKE '%spV400%'
ORDER BY p.name

但是我遇到了一个错误:

消息 102,级别 15,状态 1,第 1 行
'GO' 附近有语法错误。


http://www.devasp.net/net/articles/display/309.html - Dhaval
使用 spV400% 而不是 %spV400%。 - Veera
5个回答

11

您不需要在结尾处加上GO。

请尝试以下内容:

SELECT 'DROP PROCEDURE [' + SCHEMA_NAME(p.schema_id) + '].[' + p.NAME + ']'
FROM sys.procedures p  WHERE p.name like 'spV400%'
ORDER BY p.name
当然,这将在输出中给你一个SQL命令列表,你可以复制并粘贴到SSMS中运行。

顺便提一下,该过滤器无法找到SP_V400。 - Greg the Incredulous
1
我发现这是一个非常有用的查询! - Tony_KiloPapaMikeGolf

1
SELECT 'DROP PROCEDURE [' + SCHEMA_NAME(p.schema_id) + '].[' + p.NAME + ']' as column into #tmptable 
FROM sys.procedures p  WHERE p.name like 'spV400%' 
ORDER BY p.name
declare @deleteAll nvarchar(max)
select @deleteAll = coalesce(@deleteAll + '; ', + '') + #tmptable.column from #tmptable
EXEC sp_executesql @deleteAll
drop table #tmptable

这将把所有存储过程名称插入临时表中,然后将它们转换为分号分隔的值,并删除所有存储过程。

0

GO 不是 SQL 命令,它是 Windows 批处理的终止符。
因此,它始终需要单独一行。你只需要在代码中包含 char(10) 来进行换行。

SELECT 'DROP PROCEDURE [' + SCHEMA_NAME(p.schema_id) + '].[' + p.NAME + ']'+char(10)+'GO'
FROM sys.procedures p  WHERE p.name like '%spV400%'
ORDER BY p.name

执行上述代码,将结果集复制并粘贴到查询窗口以便使用GO关键字执行。


这样做不起作用,因为GO语句仍然在SQL语句的中间,使其在语法上不正确。如果您确实需要一个GO,它应该在ORDER BY之后的新行末尾。 - Greg the Incredulous

0

这是我的方法,

select 'DROP PROCEDURE ' + ROUTINE_SCHEMA + '.' + SPECIFIC_NAME
from    YourDBName.information_schema.routines 
where   routine_type = 'PROCEDURE' AND SPECIFIC_NAME like '%test%'

复制结果并执行。就这样。


0

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