我有數百個由DataSync自動生成的過程。刪除特定SQL Server架構中的所有存儲過程
我不必手動刪除他們的時間和感覺。
他們都開始DataSync.
有沒有辦法刪除所有存儲過程,其中名稱與DataSync.
開始?
我有數百個由DataSync自動生成的過程。刪除特定SQL Server架構中的所有存儲過程
我不必手動刪除他們的時間和感覺。
他們都開始DataSync.
有沒有辦法刪除所有存儲過程,其中名稱與DataSync.
開始?
使用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)
完美工作;-) – dg90 2012-02-08 10:34:11
假設你的意思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
我想知道「。」在名字的結尾他說。也許他們都在一個模式。 – 2012-02-08 10:24:35
@JonEgerton:好點 - 用可選的第二種方法更新我的答案 – 2012-02-08 10:27:06
是的,他們在模式中 – dg90 2012-02-08 10:31:12
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是一個模式名稱。
由於這些存儲過程是一個'DataSync'架構裏面,這個代碼將失敗 - 在「名稱」將像'storedproc1'但命令'DROP PROCEDURE storedproc1'會失敗,因爲你需要的** **架構添加到該存儲過程的名稱! – 2012-02-08 10:35:00
@marc_s:感謝您指出了(這是不是在數據同步的問題是否是模式的原始版本明確) – Tomek 2012-02-08 10:50:44
兩件事情:它仍然行不通的,因爲你從系統目錄視圖獲取'name'不包含模式 - 所以你的命令仍然是「DROP PROCEDURE proc1」,這是行不通的。另外:我會一直使用最具體的目錄視圖,例如'sys.procedures' - 這樣,你甚至不需要指定要對象的類型 - 這是從你使用 – 2012-02-08 12:13:23
我一直在使用這個簡短的腳本來清除給定模式所有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中有與我們的模式相匹配的記錄,但我們需要刪除它。
無需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)
哪個RDBMS會變成這樣嗎? – 2012-02-08 10:23:18