Как удалить все хранимые процедуры одновременно в базе данных SQL Server? - PullRequest
56 голосов
/ 10 апреля 2010

В настоящее время мы используем отдельные операторы 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] 

Есть ли способ отбросить их все сразу, или, может быть, в цикле?

Ответы [ 14 ]

121 голосов
/ 10 апреля 2010

Я бы предпочел сделать это так:

  • сначала создайте список хранимых процедур, которые нужно удалить, изучив представление системного каталога:

    SELECT 'DROP PROCEDURE [' + SCHEMA_NAME(p.schema_id) + '].[' + p.NAME + '];'
    FROM sys.procedures p 
    

    Это генерирует список DROP PROCEDURE операторов в вашем окне вывода SSMS.

  • скопировать этот список в новое окно запроса и, возможно, адаптировать его / изменить и затем выполнить его

Нет грязных и медленных курсоров, дает вам возможность проверить и перепроверить список процедур, которые должны быть отброшены, прежде чем вы его фактически удалите

101 голосов
/ 10 апреля 2010

Что-то вроде (найдено в Удалить все процедуры из базы данных с помощью хранимой процедуры в 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
73 голосов
/ 21 января 2013
  1. Нажмите на вкладку «Хранимые процедуры»
  2. Нажмите клавишу f7, чтобы отобразить все сохраненные процедуры
  3. Выбрать все процедуры по Ctrl + A , за исключением системной таблицы
  4. Нажмите кнопку «Удалить» и нажмите «ОК».

Вы можете удалить таблицу и просмотр таким же образом.

7 голосов
/ 17 июня 2011

создать ниже хранимую процедуру в вашей БД (из которой БД вы хотите удалить SP)

, затем щелкните правой кнопкой мыши по этой процедуре - щелкните по Выполнить хранимую процедуру ..

затем нажмите ОК.

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

С уважением Rizwana

Надеюсь, это поможет вам

2 голосов
/ 21 октября 2016

Чтобы получить операторы отбрасывания для всех хранимых процедур в базе данных ВЫБЕРИТЕ «ПРОЦЕДУРА КАПЛИ» + «» + F.NAME + ';' FROM SYS.объекты AS F, где type = 'P'

1 голос
/ 15 мая 2018

Попробуй, у меня это работает

DECLARE @spname sysname;
DECLARE SPCursor CURSOR FOR
SELECT SCHEMA_NAME(schema_id) + '.' + name
FROM sys.objects
WHERE type = 'P';
OPEN SPCursor;
FETCH NEXT FROM SPCursor INTO @spname;
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC('DROP PROCEDURE ' + @spname);
FETCH NEXT FROM SPCursor INTO @spname;
END
CLOSE SPCursor;
DEALLOCATE SPCursor;
1 голос
/ 24 сентября 2014
DECLARE @sql VARCHAR(MAX)
SET @sql=''
SELECT @sql=@sql+'drop procedure ['+name +'];' FROM sys.objects
WHERE type = 'p' AND  is_ms_shipped = 0
exec(@sql);
1 голос
/ 20 февраля 2014

Я думаю, что это самый простой способ:

DECLARE @sql VARCHAR(MAX)='';

SELECT @sql=@sql+'drop procedure ['+name +'];' FROM sys.objects 
WHERE type = 'p' AND  is_ms_shipped = 0

exec(@sql);
0 голосов
/ 07 декабря 2016

Попробуйте это:

declare @procName varchar(500)
declare cur cursor 

for SELECT 'DROP PROCEDURE [' + SCHEMA_NAME(p.schema_id) + '].[' + p.NAME + ']'
FROM sys.procedures p 
open cur
fetch next from cur into @procName
while @@fetch_status = 0
begin
    exec( @procName )
    fetch next from cur into @procName
end
close cur
deallocate cur
0 голосов
/ 22 мая 2015

ANSI-совместимость, без курсора

PRINT ('1.a. Delete stored procedures ' + CONVERT( VARCHAR(19), GETDATE(), 121));
GO
DECLARE @procedure NVARCHAR(max)
DECLARE @n CHAR(1)
SET @n = CHAR(10)
SELECT @procedure = isnull( @procedure + @n, '' ) +
'DROP PROCEDURE [' + schema_name(schema_id) + '].[' + name + ']'
FROM sys.procedures

EXEC sp_executesql @procedure
PRINT ('1.b. Stored procedures deleted ' + CONVERT( VARCHAR(19), GETDATE(), 121));
GO
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...