SSMS doesn't allow you to select multiple procs to run commands on at once, so you have to select them one-by-one and issue the drop. I don't know about you, but there's no way I want to do that for ten, let alone fifty or more stored procedures. A better way to approach this is to instead write a batch processing script that loops over a list of stored procedure names and executes the DROP command on each of them.
The trick here is to get a list of user-defined stored procedures that fall under the desired catalog (database) and loop over that list with a cursor. The reason for this is that unlike a WHERE clause you can't pass a list to the DROP PROCEDURE command. To accomplish a batch DROP, you have to store the resulting value from the current row retrieved from the cursor and execute the command on each value inside a loop. The complete code is shown below.
* Please be advised this code is provided as is with no warranties of any kind. Don't run this on a production environment if you're not absolutely certain as to how it will affect your database system.
-- -- DROP USER-DEFINED STORED PROCEDURES -- USE MASTER; -- Change to desired database GO SET NOCOUNT ON; PRINT '---- STARTING ----'; DECLARE @UserStoredProcedureName VARCHAR(200), @Command VARCHAR(200); PRINT '---- Creating Cursor... ----'; DECLARE SPCursor CURSOR SCROLL STATIC READ_ONLY FOR SELECT SPECIFIC_NAME FROM INFORMATION_SCHEMA.ROUTINES WHERE SPECIFIC_CATALOG = 'master' -- Change to desired database AND SPECIFIC_NAME IN -- This inner select is likely redundant, but I'm not clear on all the -- differences between sys.objects and INFORMATION_SCHEMA ( SELECT name FROM sys.objects WHERE type='P' AND is_ms_shipped = 0 -- A value of 0 represents user-defined procs -- Please note, some diagram utility stored procs don't follow this rule ); PRINT '---- ...Finished Creating Cursor ----' PRINT '---- Opening Cursor... ----'; OPEN SPCursor; PRINT '---- ...Finished Opening Cursor ----'; PRINT '---- Retrieving First Rec... ----'; FETCH NEXT FROM SPCursor INTO @UserStoredProcedureName; PRINT '---- ...Finished Retrieving First Rec ----'; PRINT '---- Starting Command Loop... ----'; WHILE(@@FETCH_STATUS = 0) BEGIN -- Include a schema name as a prefix, if necessary SET @Command = 'DROP PROCEDURE dbo.' + @UserStoredProcedureName; PRINT '---- executing:: ' + @Command; --SELECT @Command --***Only uncomment the line below if you're sure the correct procs will be affected*** --EXEC(@Command) FETCH NEXT FROM SPCursor INTO @UserStoredProcedureName; END; PRINT '---- ...Finished Command Loop ----'; PRINT '---- Closing Cursor... ----'; CLOSE SPCursor; PRINT '---- ...Done Closing Cursor ----'; PRINT '---- Deallocating Cursor... ----'; DEALLOCATE SPCursor; PRINT '---- ...Done Closing Cursor ----'; PRINT '---- FINISHED ----'; SET NOCOUNT OFF;
No comments:
Post a Comment