5

我一直使用以下作为存储过程部署脚本的一部分:

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

4 回答 4

3

OBJECT*我更喜欢这种形式,并且尽可能地停止使用元数据函数,因为它们甚至可以在松散的隔离级别下阻塞

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
于 2013-08-26T23:57:20.297 回答
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
于 2013-08-27T05:18:39.353 回答
1

我的首选方式是:

  if object_id('x') is not null
  begin
    drop procedure x
  end
  go
  create procedure x ...
  ...
于 2013-08-27T05:32:04.187 回答
0

我的 $.02 -

使用带有第二个参数的 object_id 方法。它使代码更易于阅读。

于 2013-08-26T22:10:38.153 回答