2017-04-19 41 views
1

我發現了兩個方法來檢查,如果在我們當前的代碼中存在的存儲過程:不同的方法來檢查,如果在SQL Server中存在一個存儲過程

if object_id('dbo.procedure_to_drop') is not null 

VS

if exists (select * from sysobjects where id = object_id('dbo.procedure_to_drop') and sysstat & 0xf = 4) 

什麼之間的區別他們和哪一個是更喜歡的方式?

+0

更容易閱讀和理解別人將是我的首選方法。第一個將是我的選擇。其他選項是'SELECT * FROM sysobjects WHERE id = object_id(N'[dbo]。[MyProc]')和OBJECTPROPERTY(id,N'IsProcedure')= 1'或'SELECT * FROM sys.objects WHERE type ='P '和OBJECT_ID = OBJECT_ID('dbo.MyProc')'http://stackoverflow.com/questions/2072086/how-to-check-if-a-stored-procedure-exists-before-creating-it – zedfoxus

+0

這是第3次方式:SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_TYPE ='PROCEDURE';一些列是ROUTINE_NAME,ROUTINE_DEFINITION(proc sql code),ROUTINE_SCHEMA,CREATED,LAST_ALTERED。我會使用這個或@ Morzel的答案 - 通過某種方式,您可以使用過程名稱而不是object_id - 它更易於閱讀。 –

回答

3

第一個版本檢查是否存在具有給定名稱的任何對象。在這種情況下,如果您輸入錯字並輸入表格名稱,它仍會通過。 關於第二個版本已過時,因爲如果將來的版本將支持使用sysstat,則無法保證。 (檢查msdn網站:https://docs.microsoft.com/en-us/sql/relational-databases/system-compatibility-views/sys-sysobjects-transact-sql

我不會使用它們中的任何一個。我寧願直接按名稱查詢對象:

if exists (select 1 from sys.procedures where name = 'procedure_to_drop') 

sys.procedures:https://docs.microsoft.com/en-us/sql/relational-databases/system-catalog-views/sys-procedures-transact-sql

如果您有SQL服務器2016年,您可以使用新的語言元素做取決於你想要的東西是一樣的:

相關問題