web-dev-qa-db-de.com

Wie alle gespeicherten Prozeduren gleichzeitig in der SQL Server-Datenbank löschen?

Derzeit verwenden wir für jede gespeicherte Prozedur in der Skriptdatei eine eigene Drop-Anweisung: 

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] 

Gibt es eine Möglichkeit, sie alle auf einmal fallen zu lassen, oder vielleicht in einer Schleife?

48
z-boss

So etwas wie (Gefunden unter Alle Prozeduren mit einer gespeicherten Prozedur in SQL Server aus einer Datenbank löschen ).

Nur so nebenbei, das scheint eine SEHR gefährliche Sache zu sein, nur ein Gedanke ...

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
101
Adriaan Stander

Ich würde es lieber so machen:

  • generieren Sie zuerst die Liste der gespeicherten Prozeduren, um sie zu löschen, indem Sie die Systemkatalogansicht überprüfen:

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

    Dies erzeugt eine Liste von DROP PROCEDURE-Anweisungen in Ihrem SSMS-Ausgabefenster. 

  • kopieren Sie diese Liste in ein neues Abfragefenster und passen Sie sie ggf. an/ändern Sie sie und führen Sie sie dann aus

Kein unordentlicher und langsamer Cursor ermöglicht Ihnen, Ihre Liste der Prozeduren zu überprüfen und noch einmal zu überprüfen, bevor Sie sie wirklich löschen

112
marc_s
  1. Klicken Sie auf die Registerkarte Gespeicherte Prozeduren 
  2. Drücken Sie die Taste f7, um alle gespeicherten Prozeduren anzuzeigen 
  3. Wählen Sie Alle Verfahren durch Strg + A außer Systemtabelle  
  4. Klicken Sie auf die Schaltfläche Löschen und klicken Sie auf OK. 

Sie können Tabelle und Ansicht auf dieselbe Weise löschen.

68
Sandip

erstellen Sie eine gespeicherte Prozedur in Ihrer Datenbank (aus der Sie die SPs löschen möchten).

klicken Sie dann mit der rechten Maustaste auf diese Prozedur - klicken Sie auf Gespeicherte Prozedur ausführen.

klicken Sie dann auf OK.

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

viele Grüße Rizwana

Hoffe, das wird dir helfen

6
Rizwana

So erhalten Sie Drop-Anweisungen für alle gespeicherten Prozeduren in einer DatenbankSELECT 'DROP PROCEDURE' + '' + F.NAME + ';' FROM SYS.objects AS F wobei type = 'P'

2
user7050445

Probieren Sie es aus, es funktioniert für mich

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
Aymen Bouein

Ich denke, das ist der einfachste Weg:

DECLARE @sql VARCHAR(MAX)='';

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

exec(@sql);
1
Tony O'Hagan
DECLARE @sql VARCHAR(MAX)
SET @sql=''
SELECT @[email protected]+'drop procedure ['+name +'];' FROM sys.objects
WHERE type = 'p' AND  is_ms_shipped = 0
exec(@sql);
1
Mrityunjay Ravi
DECLARE @DeleteProcCommand NVARCHAR(500)

DECLARE Syntax_Cursor CURSOR
FOR
SELECT 'DROP PROCEDURE ' + p.NAME
FROM sys.procedures p

OPEN Syntax_Cursor

FETCH NEXT FROM Syntax_Cursor

INTO @DeleteProcCommand

WHILE (@@FETCH_STATUS = 0)
BEGIN

EXEC (@DeleteProcCommand)

FETCH NEXT FROM Syntax_Cursor
INTO @DeleteProcCommand

END

CLOSE Syntax_Cursor

DEALLOCATE Syntax_Cursor
0
Falcon

Durch das Mischen von Cursor und Systemprozedur hätten wir eine optimierte Lösung wie folgt:

DECLARE DelAllProcedures CURSOR
FOR
    SELECT name AS procedure_name 
    FROM sys.procedures;
OPEN DelAllProcedures
DECLARE @ProcName VARCHAR(100)
FETCH NEXT 
FROM DelAllProcedures
INTO @ProcName
WHILE @@FETCH_STATUS!=-1
BEGIN 
    DECLARE @command VARCHAR(100)
    SET @command=''
    SET @[email protected]+'DROP PROCEDURE '[email protected]
    --DROP PROCEDURE  @ProcName
    EXECUTE (@command)
    FETCH NEXT 
    FROM DelAllProcedures
    INTO @ProcName
END
CLOSE DelAllProcedures
DEALLOCATE DelAllProcedures

Versuche dies:

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
Xtian11

Versuche dies:

DECLARE @sql NVARCHAR(MAX) = N'';

SELECT @sql += N'DROP PROCEDURE dbo.'
  + QUOTENAME(name) + ';
' FROM sys.procedures
WHERE name LIKE N'spname%'
AND SCHEMA_NAME(schema_id) = N'dbo';

EXEC sp_executesql @sql;
0
Mons'

ANSI-kompatibel, ohne Cursor

DECLARE @SQL national character varying(MAX) 
SET @SQL= ''

SELECT @SQL= @SQL+ N'DROP PROCEDURE "' + REPLACE(SPECIFIC_SCHEMA, N'"', N'""') + N'"."' + REPLACE(SPECIFIC_NAME, N'"', N'""') + N'"; '
FROM INFORMATION_SCHEMA.ROUTINES 

WHERE (1=1) 
AND ROUTINE_TYPE = 'PROCEDURE' 
AND ROUTINE_NAME NOT IN 
(
     'dt_adduserobject'
    ,'dt_droppropertiesbyid'
    ,'dt_dropuserobjectbyid'
    ,'dt_generateansiname'
    ,'dt_getobjwithprop'
    ,'dt_getobjwithprop_u'
    ,'dt_getpropertiesbyid'
    ,'dt_getpropertiesbyid_u'
    ,'dt_setpropertybyid'
    ,'dt_setpropertybyid_u'
    ,'dt_verstamp006'
    ,'dt_verstamp007'

    ,'sp_helpdiagrams'
    ,'sp_creatediagram'
    ,'sp_alterdiagram'
    ,'sp_renamediagram'
    ,'sp_dropdiagram'

    ,'sp_helpdiagramdefinition'
    ,'fn_diagramobjects'
    ,'sp_upgraddiagrams'
) 


ORDER BY SPECIFIC_NAME 


-- PRINT @SQL
EXEC(@SQL) 

Ohne Cursor, nicht ansi-konform: 

DECLARE @sql NVARCHAR(MAX) = N''
, @lineFeed NVARCHAR(2) = CHAR(13) + CHAR(10) ;

SELECT @sql = @sql + N'DROP PROCEDURE ' + QUOTENAME(SPECIFIC_SCHEMA) + N'.' + QUOTENAME(SPECIFIC_NAME) + N';' + @lineFeed
FROM INFORMATION_SCHEMA.ROUTINES 
WHERE ROUTINE_TYPE = 'PROCEDURE' 
-- AND SPECIFIC_NAME LIKE 'sp[_]RPT[_]%'


AND ROUTINE_NAME NOT IN 
( 
    SELECT name FROM sys.procedures WHERE is_ms_shipped <> 0 
) 


ORDER BY SPECIFIC_NAME 


-- PRINT @sql 
EXECUTE(@sql)
0
Stefan Steiger

ANSI-kompatibel, ohne Cursor

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
0
jorgedison