2013-01-20 79 views
9

我在我的Sql server 2008 R2數據庫中有200 Stored Procedures,這些數據庫是由應用程序自動生成的。現在我想刪除它們全部並重新生成它們,因爲表格已經改變了很多。一次刪除所有存儲過程

This question is very similar to my case但對我來說與以sp_所有SP的開始,我認爲這是危險的,使用相同的代碼,因爲系統SP的也以sp_開始,我可以把他們全部殺死。

我是否應該相信the link above中的解決方案?如果不是有更安全的解決方案?

+1

但'sp_' _that是自動GENERATED_擴展名是'.sys'和你創建'sp_'是'.dbo'如果是正確的。所以提示是得到所有'.dbo'擴展名並將其刪除:) – spajce

回答

24

如果這是一次性任務,只需打開對象資源管理器,展開數據庫>可編程性並突出顯示「存儲過程」節點。然後打開對象資源管理器詳細信息(我認爲是F7)。在右側,你應該看到你的列表,在這裏你可以多選 - 所以你可以按名稱排序,選擇所有以sp_開頭的過程,並用一個按鍵刪除它們。

如果反覆這樣做,那麼(假設你的程序都在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? :)感謝之手 –

+0

能夠使用單個'SELECT'加'EXEC'而不是必須聲明'CURSOR'並迭代是非常整潔的。我不知道T-SQL允許你以這種方式建立一個字符串('SELECT @sql + ='),非常聰明。 – JonBrave

+0

正在尋找這樣的解決方案。 我對查詢做了一些調整。 DECLARE \ @sql NVARCHAR(MAX)= N''; SELECT \ @sql + = N'DROP PROCEDURE ['+ SCHEMA_NAME(p。[schema_id])+']。' + QUOTENAME(第[頁面])+';' FROM sys.procedures p WHERE p.is_ms_shipped = 0 --AND SCHEMA_NAME(p。[schema_id])IN(N'dbo') EXEC sp_executesql \ @sql; 查詢不再硬編碼到dbo模式。 另外我添加了一個過濾器,以避免刪除系統存儲過程。 也有一個標準來限制架構(s),雖然我不需要它在我的情況。 –

0

我發現這個How to Drop All Stored Procedures in Your Database然後我測試並在存儲過程之外創建StoredProcedure夾。

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