2009-06-02 87 views
99

如果存储过程存在或不存在,则必须编写一个部署脚本,该脚本将起作用。即如果它存在,那么我需要改变它,否则创建它。如何检测存储过程是否已存在

如何在sql中执行此操作。

我使用SQL Server 2005

回答

7

编辑:之前的代码块不把文字杀死它......一直忘了:)

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名称

0

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

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

最简洁的方法是测试它的存在,如果它存在,则放弃它,然后重新创建它。您不能在IF语句中嵌入“create proc”语句。这将大大地做:

IF OBJECT_ID('MySproc', 'P') IS NOT NULL 
DROP PROC MySproc 
GO 

CREATE PROC MySproc 
AS 
BEGIN 
    ... 
END 
+0

这是可行的,但它去除施加到存储过程更改安全性。 – Andomar 2009-06-02 06:42:15

+15

安全更改也应该是脚本的一部分。这样,它将得到适当的记录。这是正确的方法。 – 2012-01-20 16:16:59

+0

@EnderWiggin除非安全实现在设计时不知道......如果开发人员不知道哪些用户需要执行权限? – 2013-11-22 05:54:21

27

如果你只用存储过程处理,最容易做的事情是可能掉落PROC,然后重新创建。您可以使用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... 
135

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

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

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

通过这种方式,安全设置,注释和其他元标记将在部署期间继续存在。

0

我有一个存储过程,使客户扩展验证,如果它存在,我不想改变它,如果没有我要创建它,最好的办法,我发现:

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 
4

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

语法:

DROP {PROC | PROCEDURE} [IF EXISTS] {[schema_name。 ] procedure} [,...N]

查询:

DROP PROCEDURE IF EXISTS usp_name 

更多信息here

0

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

如果它存在,它会改变,如果不存在,它会创建一个新的存储过程为您提供:

//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 @[email protected] + @Proc 

     EXEC (@proc) 
    END 
ELSE 
    BEGIN 
     SET @[email protected] + @Proc 

     EXEC (@proc) 
    END 

go