Answers:
如果删除并创建该过程,则将丢失安全设置。这可能会惹恼您的DBA或完全破坏您的应用程序。
我要做的是创建一个简单的存储过程(如果尚不存在)。之后,您可以根据自己的喜好更改存储过程。
IF object_id('YourSp') IS NULL
EXEC ('create procedure dbo.YourSp as select 1')
GO
ALTER PROCEDURE dbo.YourSp
AS
...
这样,安全设置,注释和其他元数据将在部署中保留下来。
if object_id('YourSp') is null BEGIN ... END
在创建存储过程之后在中添加代码以添加适当的权限。
最干净的方法是测试它的存在,将其删除(如果存在),然后重新创建它。您不能在IF语句中嵌入“ create proc”语句。这应该做得很好:
IF OBJECT_ID('MySproc', 'P') IS NOT NULL
DROP PROC MySproc
GO
CREATE PROC MySproc
AS
BEGIN
...
END
除了已经说过的内容之外,我还喜欢添加一种不同的方法并主张使用差异脚本部署策略。通过制作一系列从知名版本升级的无状态脚本,可以部署而不是始终检查当前状态并根据该状态进行操作的有状态脚本。我已经使用了这种策略,并且由于我的部署脚本现在全部都是“ IF”免费的,因此可以节省大量时间。
您可以编写查询,如下所示:
IF OBJECT_ID('ProcedureName','P') IS NOT NULL
DROP PROC ProcedureName
GO
CREATE PROCEDURE [dbo].[ProcedureName]
...your query here....
更具体地讲上述语法:
OBJECT_ID是数据库中对象的唯一ID号,SQL Server在内部使用该ID号。由于我们传递的是过程名称,后跟您的对象类型P告诉SQL Server,您应该找到名为过程名称的对象,该对象的类型为过程,即P
此查询将找到该过程,如果可用,它将删除它并创建一个新过程。
有关OBJECT_ID和对象类型的详细信息,请访问: SYS.Objects
IF OBJECT_ID('SPNAME') IS NULL
-- Does Not Exists
ELSE
-- Exists
我有一个存储的过程,该过程允许客户扩展验证,如果存在,我不想更改它,如果不希望创建,这是我发现的最好方法:
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
下面的代码将检查存储过程是否已经存在。
如果存在,它将改变;如果不存在,它将为您创建一个新的存储过程:
//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