如何检测存储过程是否已经存在
我必须编写一个部署脚本,这个脚本在存储过程存在或不存在的情况下可以工作。 即如果它存在,那么我需要改变它,否则创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