我過去使用下面的存儲過程的部署腳本的一部分的首選方式:什麼是確定的存儲過程中是否存在
IF NOT EXISTS (SELECT * FROM sys.objects O
WHERE O.[object_id] = OBJECT_ID(N'[dbo].[SPROC_NAME]')
AND OBJECTPROPERTY(O.[object_id],N'IsProcedure') = 1)
EXEC('CREATE PROCEDURE [dbo].[SPROC_NAME] AS')
GO
ALTER PROCEDURE [dbo].[SPROC_NAME]
AS
BEGIN ...
我不知道超載至OBJECT_ID
,這需要鍵入對象ID查找,例如:
OBJECT_ID(N'[dbo].[SPROC_NAME]', N'P')
好像使用過載將使OBJECTPROPERTY
查找不必要的。
我想知道是否有任何缺點,只使用OBJECT_ID
過載和刪除OBJECTPROPERTY
查找。
SQL對象都共享相同的唯一名稱空間。 'OBJECT_ID'返回具有該名稱的對象的ID(如果存在)。 'OBJECTPROPERTY'確認該對象實際上是一個存儲過程,因爲可能有一個名爲'[SPROC_NAME]'的表或視圖(如果存在的話,您將無法創建具有該名稱的存儲過程)。 – RBarryYoung
如果指定了第二個參數,則只有該類型的對象存在時,「OBJECT_ID」纔會返回非空值。 (確保指定模式,不知道如果它是一個模式中的表和另一個模式中的過程會發生什麼......) –