我历来使用以下内容作为存储过程部署脚本的一部分:
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
查找是否有任何缺点。
答案 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方法与第二个参数一起使用。它使代码更容易阅读。