2

我正在使用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 

但我得到一个错误:

Msg 102, Level 15, State 1, Line 1
Incorrect syntax near 'GO'.

+0

http://www.devasp.net/net/articles/display/309.html – Dhaval 2014-11-25 04:35:49

+0

USE spV400%NOT%spV400%。 – Veera 2014-11-25 04:36:52

回答

4

你不需要在最后的GO。

试试这个:

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

这当然会给你一个列表,其中您可以复制并粘贴到SSMS并运行输出的SQL命令。

+0

非常感谢。 – 2014-11-25 04:35:54

+0

顺便说一下,过滤器不会找到SP_V400。 – 2014-11-25 04:36:38

+0

我发现这是一个非常有用的查询! – 2017-01-05 09:29:09

0

GO不是SQL CMD,其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关键字。

+0

这不起作用,因为GO语句仍然处于SQL语句的中间,使得它在语法上不正确。如果你真的需要一个GO,它应该在ORDER BY之后的一个新行中结束。 – 2017-01-06 02:57:33

0

这是我的方法,

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

复制的结果和执行。就这样。

相关问题