如何在SQL Server数据库中一次删除所有存储过程?

z-b*_*oss 60 sql t-sql sql-server

目前,我们在脚本文件中为每个存储过程使用单独的drop语句:

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[MySP]')   
  AND type in (N'P', N'PC'))  
DROP PROCEDURE [dbo].[MySP] 
Run Code Online (Sandbox Code Playgroud)

有没有办法一次性将它们全部丢弃,或者可能在一个循环中?

mar*_*c_s 123

我更喜欢这样做:

  • 首先通过检查系统目录视图生成要删除的存储过程列表:

    SELECT 'DROP PROCEDURE [' + SCHEMA_NAME(p.schema_id) + '].[' + p.NAME + '];'
    FROM sys.procedures p 
    
    Run Code Online (Sandbox Code Playgroud)

    这将DROP PROCEDURE在SSMS输出窗口中生成语句列表.

  • 将该列表复制到新的查询窗口中,并可能对其进行调整/更改然后执行它

没有杂乱和缓慢的游标,使您能够检查并仔细检查您的实际删除之前要删除的过程列表

  • 我需要这个用于部署,所以它必须是自动的. (4认同)
  • 我必须说光标比复制和粘贴更快. (2认同)
  • 精湛的答案,节省了我很多时间. (2认同)
  • 这个非常有用,特别是当你不应该在某个地方(比如主人)添加SP时.通过预检,为您提供一种简单的清理方法. (2认同)
  • 很喜欢这种方式!如果您只想删除一些或一半或部分程序,也非常方便.如果您使用"order by",您可以对其进行排序,并在放弃之前更好地查看. (2认同)

Adr*_*der 103

类似于(使用SQL Server中的存储过程从数据库删除所有过程).

顺便说一句,这似乎是一件非常危险的事情,只是一个想法......

declare @procName varchar(500)
declare cur cursor 

for select [name] from sys.objects where type = 'p'
open cur
fetch next from cur into @procName
while @@fetch_status = 0
begin
    exec('drop procedure [' + @procName + ']')
    fetch next from cur into @procName
end
close cur
deallocate cur
Run Code Online (Sandbox Code Playgroud)

  • 首先,因为它缺少一个额外的WHERE子句:对于sys.objects中的select [name],其中type ='p'AND is_ms_shipped = 0 (5认同)
  • 我刚试过这个.它不会删除系统sprocs. (2认同)
  • 顺便说一句,在proc名称周围添加[],以防你有任何奇怪的事.Exec应如下所示:exec('drop procedure ['+ @procName +']') (2认同)
  • 无所畏惧的开发人员喜欢危险的脚本。Namaste。 (2认同)
  • 此脚本缺少架构名称,仅适用于 dbo 的对象。 (2认同)

小智 75

  1. 单击"存储过程"选项卡
  2. 按f7显示所有存储过程
  3. 系统表除 Ctrl + A选择所有过程
  4. 按删除按钮,然后单击确定.

您可以以相同的方式删除表格和视图.

  • 我是这个解决方案,如果是一次性操作,它更容易从GUI工作. (4认同)
  • 那只是为我节省了很多时间:) (2认同)

小智 7

在db中创建下面的存储过程(从中你想删除sp的db)

然后右键单击该过程 - 单击执行存储过程..

然后单击确定.

create Procedure [dbo].[DeleteAllProcedures]
As 
declare @schemaName varchar(500)    
declare @procName varchar(500)
declare cur cursor
for select s.Name, p.Name from sys.procedures p
INNER JOIN sys.schemas s ON p.schema_id = s.schema_id
WHERE p.type = 'P' and is_ms_shipped = 0 and p.name not like 'sp[_]%diagram%'
ORDER BY s.Name, p.Name
open cur

fetch next from cur into @schemaName,@procName
while @@fetch_status = 0
begin
if @procName <> 'DeleteAllProcedures'
exec('drop procedure ' + @schemaName + '.' + @procName)
fetch next from cur into @schemaName,@procName
end
close cur
deallocate cur
Run Code Online (Sandbox Code Playgroud)

关于Rizwana

希望对你有帮助