我过去在存储过程部署脚本中经常使用以下内容:
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 ...
我之前不知道有一种可以通过类型查找对象ID的OBJECT_ID
负载。
OBJECT_ID(N'[dbo].[SPROC_NAME]', N'P')
似乎使用那个重载可以省去
OBJECTPROPERTY
的查找。我想知道只使用OBJECT_ID
重载并放弃OBJECTPROPERTY
的查找是否有任何不利影响。
OBJECT_ID
返回该对象的ID。OBJECTPROPERTY
确认该对象实际上是存储过程,因为可能会有一个名为[SPROC_NAME]
的表或视图(如果有,则无法使用该名称创建存储过程)。 - RBarryYoungOBJECT_ID
只会返回一个非空值,如果存在该类型的对象。(确保指定模式,不知道如果它是一个模式中的表和另一个模式中的过程会发生什么...) - Philip Kelley