2013-01-20 10 views
9

Mam 200 Stored Procedures w mojej bazie danych Sql server 2008 R2, które są automatycznie generowane przez aplikację. Teraz chcę je usunąć wszystkie i zregenerować je, ponieważ tabele bardzo się zmieniły.Usuń wszystkie przechowywane procedury naraz

This question is very similar to my case ale w moim przypadku wszystko uruchomić SP jest z sp_ i uważa, że ​​to niebezpieczne, aby użyć tego samego kodu od systemu SP też zacząć sp_ i mogę zabić ich wszystkich.

Czy mogę zaufać rozwiązaniu pod the link above? Jeśli nie, czy istnieje bezpieczniejsze rozwiązanie?

+1

ale 'sp_' _that są automatycznie generated_ rozszerzenie jest' .sys' a stworzony 'sp_' jest' .dbo' jeśli mylę. więc podpowiedź dostaje całe rozszerzenie '.dbo' i je usuwa :) – spajce

Odpowiedz

24

Jeśli jest to jednorazowe zadanie, po prostu otwórz Eksplorator obiektów, rozwiń bazę danych> programowalność i zaznacz węzeł Przechowywane procedury. Następnie włącz Szczegóły eksploratora obiektów (myślę, że F7). Po prawej stronie powinieneś zobaczyć swoją listę, a tutaj możesz dokonać wielu wyborów - możesz sortować według nazwy, wybrać wszystkie procedury zaczynające się od sp_ i usunąć wszystkie za jednym naciśnięciem klawisza.

Jeśli robisz to wielokrotnie, to (zakładając Państwa procedury są w schemacie dbo):

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

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

EXEC sp_executesql @sql; 
+0

@AaroBerrand? :) dzięki człowieku –

+0

Umiejętność użycia pojedynczego 'SELECT' plus' EXEC' zamiast zadeklarowania 'CURSOR' i iteracji przez to jest naprawdę zgrabna. Nie wiedziałem, że T-SQL pozwoliło ci zbudować ciąg w ten sposób ('SELECT @sql + ='), bardzo sprytny. – JonBrave

+0

Szukałem rozwiązania takiego jak to. Mam kilka poprawek do zapytania. DECLARE \ @sql NVARCHAR (MAX) = N ''; SELECT \ @sql + = PROCEDURA N'DROP ['+ SCHEMA_NAME (p. [Schema_id]) +']. ' + QUOTENAME (p. [Nazwa]) + ";" Z sys.procedures P GDZIE p.is_ms_shipped = 0 --AND schema_name (p [schema_id]). W ") (N'dbo EXEC sp_executesql \ @sql; Zapytanie nie jest już przypisane do schematu dbo. Dodałem również filtr, aby uniknąć usuwania procedur przechowywanych w systemie. Istnieje również kryterium ograniczenia według schematów, chociaż nie było to konieczne w moim przypadku. –

0

Znalazłem How to Drop All Stored Procedures in Your Database potem testowane i StoredProcedure jest tworzony na zewnątrz procedur przechowywanych teczka.

CREATE PROC UserStoredProcedure_Sample1 
AS 
     SELECT 'SQL Server rocks' 
    GO 

CREATE PROC UserStoredProcedure_Sample2 
AS 
    SELECT 'SQL Server rocks' 
GO 

SET NOCOUNT ON 

    -- to do this we have to use EXEC instead of sp_executesql 
-- sp_executesql does not accept a DROP command in the SQL String 
DECLARE @UserStoredProcedure VARCHAR(100) 
DECLARE @Command     VARCHAR(100) 

DECLARE UserStoredProcedureCursor CURSOR SCROLL STATIC READ_ONLY FOR 
SELECT 
    SPECIFIC_NAME 
FROM 
    INFORMATION_SCHEMA.ROUTINES 

    OPEN UserStoredProcedureCursor 

FETCH NEXT FROM UserStoredProcedureCursor 
INTO @UserStoredProcedure 
    WHILE (@@FETCH_STATUS = 0) BEGIN 
     SET @Command = 'DROP PROCEDURE ' + @UserStoredProcedure 

     -- display; visual check 
     SELECT @Command 

     -- when you are ready to execute, uncomment below 
     EXEC (@Command) 

     FETCH NEXT FROM UserStoredProcedureCursor 
     INTO @UserStoredProcedure 
    END 


CLOSE UserStoredProcedureCursor 
DEALLOCATE UserStoredProcedureCursor 

    SET NOCOUNT OFF 
0
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
DECLARE @sql VARCHAR(MAX)=''; 

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

exec(@sql); 
1
-- drop all user defined stored procedures 

    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 
Powiązane problemy