2010-02-02 61 views
1

我很好奇我是否可以簡單地使用「%」刪除多個程序? 像:刪除多個程序(SQL2005)

DROP constantName%

當我在管理工作室使用DROP,它看起來就像是:

/****** Object: StoredProcedure [dbo].[x] Script Date: 02/02/2010 09:36:25 ******/ 
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[x]') AND type in (N'P', N'PC')) 
DROP PROCEDURE [dbo].[x] 

爲什麼它被檢查時,我下探此特定對象的對象ID?

回答

1

OBJECT_ID返回模式範圍對象的數據庫對象標識號。在您的代碼中,它將在IF EXISTS中對其進行檢查,以便它只會在存儲在數據庫中時刪除存儲的proc。

您可能只有DROP PROCEDURE proc_name,但如果過程不存在,最終可能會出現錯誤。在刪除之前檢查它是一種很好的做法。

表,視圖,存儲過程等都有一個OBJECT_ID作爲關鍵標識符。

我不相信你可以使用LIKE刪除多個存儲過程。 (儘管我; m不是100%確定的)

1

恐怕你不能在DROP中使用類似的語法,在簡單的單行下面放置多個過程。

DROP PROCEDURE testest,testest1 

併爲您的第二個問題。我們可以創建只有特定角色才能訪問的StoredProcedure。

create proc dbo.testest 
as 
begin 
    select 1 
end 

查詢與角色值sys.objects中

select * from sys.objects where name ='dbo.testest' 

返回null

select * from sys.objects where name ='testest' 

現在的作品

sys.objects中的目錄視圖存儲信息,而角色名字(只是名字)。但是使用OBJECT_ID,我們可以檢索角色的具體信息

select OBJECT_ID('dbo.testest') //works 
    select OBJECT_ID('testest') //works 

希望你現在能理解。

+0

我想OP想知道如何在一個查詢中刪除多個存儲過程。閱讀問題。 – invert 2010-02-02 09:04:47

+1

@keyboardmonkey,「當我放棄這個特定對象時,爲什麼它檢查對象ID?」他特意問了.... – RameshVel 2010-02-02 09:06:18

+0

並且這是drop掉mutliplr procs的唯一方法。DROP PROCEDURE testest,testest1這樣做會訣竅。 – RameshVel 2010-02-02 09:09:35

1

我認爲SQL的設計有這個限制,drop procedure命令需要一個字符串常量。你不能傳遞一個變量作爲參數,當你這樣做時,它只會給出一個'不正確的語法'錯誤。

此外,OBJECT_ID函數僅返回用戶擁有或有權限的對象的有效標識。所以使用OBJECT_ID是因爲它執行安全驗證。

只用「WHERE name ='object_name''刪除也可以,但只有當用戶具有該對象的權限時纔可以。