确定存储过程是否存在的首选方法是什么

时间:2013-08-26 21:35:26

标签: sql-server tsql stored-procedures

我历来使用以下内容作为存储过程部署脚本的一部分:

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查找是否有任何缺点。

4 个答案:

答案 0 :(得分:3)

我更喜欢这种形式,并且尽可能地停止使用OBJECT*元数据函数,因为they can block even at loose isolation levels

IF NOT EXISTS 
(
   SELECT 1 FROM sys.procedures AS p
     INNER JOIN sys.schemas AS s
     ON p.[schema_id] = s.[schema_id]
     WHERE p.name = N'Procedure_Name' AND s.name = N'dbo'
)
BEGIN
  EXEC sp_executesql N'CREATE PROCEDURE dbo.Procedure_Name AS';
END

答案 1 :(得分:1)

你的病情可能会短一些:

    IF OBJECT_DEFINITION(OBJECT_ID('dbo.Procedure_Name', 'P')) IS NULL
    BEGIN
        EXEC sys.sp_executesql 'CREATE PROCEDURE dbo.Procedure_Name AS'
    END

另一种方式:

    IF OBJECT_ID('dbo.Procedure_Name', 'P') IS NULL
    BEGIN
        EXEC sys.sp_executesql 'CREATE PROCEDURE dbo.Procedure_Name AS'
    END

答案 2 :(得分:1)

我的首选方式是:

  if object_id('x') is not null
  begin
    drop procedure x
  end
  go
  create procedure x ...
  ...

答案 3 :(得分:0)

我的$ .02 -

将object_id方法与第二个参数一起使用。它使代码更容易阅读。