我过去曾使用以下内容作为存储过程部署脚本的一部分:
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
查找是否有任何缺点。
最佳答案
我更喜欢这种形式,并已尽可能停止使用 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
关于sql-server - 识别存储过程是否存在的首选方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18453420/