2012-02-08 63 views
4

我有數百個由DataSync自動生成的過程。刪除特定SQL Server架構中的所有存儲過程

我不必手動刪除他們的時間和感覺。

他們都開始DataSync.

有沒有辦法刪除所有存儲過程,其中名稱與DataSync.開始?

+4

哪個RDBMS會變成這樣嗎? – 2012-02-08 10:23:18

回答

21

使用INFORMATION_SCHEMA.ROUTINES(這是跨RDBMS的相當標準,如MSSQL,MySQL的):

如果您的proc名稱開始「DataSync」。那麼他們很可能是在一個模式,這樣你就可以找到他們:

select 
    'DROP PROCEDURE [' + routine_schema + '].[' + routine_name + ']' 
from 
    information_schema.routines where routine_schema = 'DataSync' and routine_type = 'PROCEDURE' 

如果您PROC名稱開頭「數據同步」,那麼你可以找到他們:

select 
    'DROP PROCEDURE [' + routine_schema + '].[' + routine_name + ']' 
from 
    information_schema.routines where routine_name like 'DataSync%' and routine_type = 'PROCEDURE' 

如果你想執行所有這些下降的語句,你可以建立一個執行使用FOR XML路徑,如下所示:

declare @sql varchar(max) 

set @sql = (
select 
    'DROP PROCEDURE [' + routine_schema + '].[' + routine_name + '] ' 
from 
    information_schema.routines where routine_schema = 'DataSync' and routine_type = 'PROCEDURE' 
FOR XML PATH ('') 
) 

exec (@sql) 
+0

完美工作;-) – dg90 2012-02-08 10:34:11

5

假設你的意思SQL服務器當您指定「SQL」 - 那麼最簡單的方法是:運行此查詢:

SELECT 
    name, 
    DropCmd = 'DROP PROCEDURE DataSync.' + name 
FROM sys.procedures 
WHERE 
    schema_id = SCHEMA_ID('DataSync') 

和甚至「懶惰」的版本將使用遊標自動爲您做到這一點:

DECLARE DropSpCursor CURSOR FAST_FORWARD FOR 
    SELECT 
     name 
    FROM sys.procedures 
    WHERE schema_id = SCHEMA_ID('DataSync') 

DECLARE @StoredProcName sysname 
DECLARE @DropStatement NVARCHAR(1000) 

OPEN DropSpCursor 

FETCH NEXT FROM DropSpCursor INTO @StoredProcName, @SchemaName 

WHILE (@@fetch_status <> -1) 
BEGIN 
    IF (@@fetch_status <> -2) 
    BEGIN 
     SET @DropStatement = N'DROP PROCEDURE DataSync.' + @StoredProcName 
     EXEC(@DropStatement) 
    END 

    FETCH NEXT FROM DropSpCursor INTO @StoredProcName 
END 

CLOSE DropSpCursor 
DEALLOCATE DropSpCursor 
+4

我想知道「。」在名字的結尾他說。也許他們都在一個模式。 – 2012-02-08 10:24:35

+0

@JonEgerton:好點 - 用可選的第二種方法更新我的答案 – 2012-02-08 10:27:06

+0

是的,他們在模式中 – dg90 2012-02-08 10:31:12

0
DECLARE @name AS VARCHAR(max) 

DECLARE MyCursor CURSOR FAST_FORWARD READ_ONLY FOR 
SELECT name FROM sys.objects WHERE type='P' AND schema_id=SCHEMA_ID('DataSync') 

OPEN MyCursor 

FETCH NEXT FROM MyCursor INTO @name 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    EXEC('DROP PROCEDURE DataSync.' + @name) 
    FETCH NEXT FROM MyCursor INTO @name 
END 

CLOSE MyCursor 
DEALLOCATE MyCursor 

編輯:改變where子句因爲它證明DataSync是一個模式名稱。

+0

由於這些存儲過程是一個'DataSync'架構裏面,這個代碼將失敗 - 在「名稱」將像'storedproc1'但命令'DROP PROCEDURE storedproc1'會失敗,因爲你需要的** **架構添加到該存儲過程的名稱! – 2012-02-08 10:35:00

+0

@marc_s:感謝您指出了(這是不是在數據同步的問題是否是模式的原始版本明確) – Tomek 2012-02-08 10:50:44

+0

兩件事情:它仍然行不通的,因爲你從系統目錄視圖獲取'name'不包含模式 - 所以你的命令仍然是「DROP PROCEDURE proc1」,這是行不通的。另外:我會一直使用最具體的目錄視圖,例如'sys.procedures' - 這樣,你甚至不需要指定要對象的類型 - 這是從你使用 – 2012-02-08 12:13:23

0

我一直在使用這個簡短的腳本來清除給定模式所有SP(使用SQL Server時)。它迭代直接sys.procedures。

DECLARE @schema VARCHAR(100) 
SET @schema = 'DataSync' 

DECLARE @CurrentStatement AS VARCHAR(MAX) 
SET @CurrentStatement = (SELECT TOP(1) 'DROP PROCEDURE [' + @schema + '].[' + name + ']' 
FROM sys.procedures 
WHERE schema_id = SCHEMA_ID(@schema)) 

WHILE @CurrentStatement IS NOT NULL 
BEGIN 
    EXEC (@CurrentStatement)  
    SET @CurrentStatement = (SELECT TOP(1) 'DROP PROCEDURE [' + @schema + '].[' + name + ']' 
    FROM sys.procedures 
    WHERE schema_id = SCHEMA_ID(@schema)) 
END 

前提與marc_s提供的答案非常相似;但是不會爲迭代使用遊標。儘管sys.procedures中有與我們的模式相匹配的記錄,但我們需要刪除它。

0

無需XML或循環:

declare @sql varchar(max) = '' 

select @sql += 'drop procedure [' + routine_schema + '].[' + routine_name + '];' 
from information_schema.routines where routine_schema = 'DataSync' and routine_type = 'PROCEDURE' 

exec(@sql) 
相關問題