如何检测存储过程是否已经存在

我必须编写一个部署脚本,这个脚本在存储过程存在或不存在的情况下可以工作。 即如果它存在,那么我需要改变它,否则创build它。

我怎么能在SQL中做到这一点。

我正在使用SQL Server 2005

如果您删除并创build该程序,您将失去安全设置。 这可能会惹恼你的数据库pipe理员或完全破坏你的应用程序。

我所做的是创build一个简单的存储过程,如果它还不存在。 之后,您可以按照自己的喜好更改存储过程。

IF object_id('YourSp') IS NULL EXEC ('create procedure dbo.YourSp as select 1') GO ALTER PROCEDURE dbo.YourSp AS ... 

这样,安全设置,评论和其他元分解将在部署之后幸存下来。

最简洁的方法是testing它的存在,如果它存在,则放弃它,然后重新创build它。 您不能在IF语句中embedded“create proc”语句。 这应该做得很好:

 IF OBJECT_ID('MySproc', 'P') IS NOT NULL DROP PROC MySproc GO CREATE PROC MySproc AS BEGIN ... END 

如果只处理存储过程,最简单的方法就是放弃proc,然后重新创build它。 您可以使用SQL Server中的“生成脚本”向导生成所有代码。

 IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[YourSproc]') AND type in (N'P', N'PC')) DROP PROCEDURE [dbo].[YourSproc] CREATE PROCEDURE YourSproc... 

编辑:没有把代码块之前的文本杀死它…总是忘记:)

 if not exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[xxx]') and OBJECTPROPERTY(id, N'IsProcedure') = 1) BEGIN CREATE PROCEDURE dbo.xxx 

xxx是proc的名字

SQL Server 2016 CTP3您可以使用新的DIE语句而不是大的IF包装

句法:

DROP {PROC | PROCEDURE} [IF EXISTS] {[schema_name。 ] procedure} [,… n]

查询:

 DROP PROCEDURE IF EXISTS usp_name 

更多信息在这里

除了已经说过的内容之外,我还想添加一个不同的方法,并主张使用差分脚本部署策略。 而不是制作一个总是检查当前状态并基于该状态行事的有状态脚本,而是通过一系列从众所周知的版本升级的无状态脚本进行部署 。 我已经使用了这个策略,因为我的部署脚本现在全部是“免费”,所以我们付出了大量的时间。

 IF OBJECT_ID('SPNAME') IS NULL -- Does Not Exists ELSE -- Exists 

我同意Luke,但是更好的select可能是使用像Red-Gate SQL Compare或SQL Examiner这样的工具来自动比较差异并生成迁移脚本。

我有一个存储过程,允许客户扩展validation,如果存在我不想改变它,如果它不是我想创build它,我发现的最好的方法:

 IF OBJECT_ID('ValidateRequestPost') IS NULL BEGIN EXEC ('CREATE PROCEDURE ValidateRequestPost @RequestNo VARCHAR(30), @ErrorStates VARCHAR(255) OUTPUT AS BEGIN SELECT @ErrorStates = @ErrorStates END') END 

下面的代码将检查存储过程是否已经存在。

如果它存在,它将会改变,如果它不存在,它会为你创build一个新的存储过程:

 //syntax for Create and Alter Proc DECLARE @Create NVARCHAR(200) = 'Create PROCEDURE sp_cp_test'; DECLARE @Alter NVARCHAR(200) ='Alter PROCEDURE sp_cp_test'; //Actual Procedure DECLARE @Proc NVARCHAR(200)= ' AS BEGIN select ''sh'' END'; //Checking For Sp IF EXISTS (SELECT * FROM sysobjects WHERE id = Object_id('[dbo].[sp_cp_test]') AND Objectproperty(id, 'IsProcedure') = 1 AND xtype = 'p' AND NAME = 'sp_cp_test') BEGIN SET @Proc=@Alter + @Proc EXEC (@proc) END ELSE BEGIN SET @Proc=@Create + @Proc EXEC (@proc) END go