sql-server - 识别存储过程是否存在的首选方法是什么

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

最佳答案

我更喜欢这种形式,并已尽可能停止使用 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/

相关文章:

sql-server - 将查询结果传递给存储过程

mysql - 在 MySQL 存储过程中使用 "if"和 "else"

sql-server - 无法使用 Excel 数据透视表中 SQL 中的日期列对此选择进行分组

sql - 从现有数据填充 Visual Studio 数据库项目数据加载脚本

sql-server - @@OPTIONS 位掩码与 DISABLE_DEF_CNST_CHK

java - hibernate 和存储过程

sql - 在 SQL 表中查找有效的重叠条目

sql-server - 连接 2 个表时排除输出中重复列的 T-SQL 语法是什么?

mysql - 如何使用 pentaho 数据集成获取唯一记录

sql - 如何同时使用 SQL WHERE CASE 和 NOT IN 或 equals?