如果存储过程存在或不存在,则必须编写一个部署脚本,该脚本将起作用。即如果它存在,那么我需要改变它,否则创建它。如何检测存储过程是否已存在
如何在sql中执行此操作。
我使用SQL Server 2005
如果存储过程存在或不存在,则必须编写一个部署脚本,该脚本将起作用。即如果它存在,那么我需要改变它,否则创建它。如何检测存储过程是否已存在
如何在sql中执行此操作。
我使用SQL Server 2005
编辑:之前的代码块不把文字杀死它......一直忘了:)
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名称
我同意Luke,但更好的选择可能是使用像Red-Gate SQL Compare或SQL Examiner这样的工具自动比较差异并生成迁移脚本。
IF OBJECT_ID('SPNAME') IS NULL
-- Does Not Exists
ELSE
-- Exists
最简洁的方法是测试它的存在,如果它存在,则放弃它,然后重新创建它。您不能在IF语句中嵌入“create proc”语句。这将大大地做:
IF OBJECT_ID('MySproc', 'P') IS NOT NULL
DROP PROC MySproc
GO
CREATE PROC MySproc
AS
BEGIN
...
END
如果你只用存储过程处理,最容易做的事情是可能掉落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...
如果您删除并创建过程,您将失去安全设置。这可能会惹恼您的数据库管理员或完全破坏您的应用程序。
我所做的是创建一个普通的存储过程,如果它还不存在。之后,您可以按照自己的喜好更改存储过程。
IF object_id('YourSp') IS NULL
EXEC ('create procedure dbo.YourSp as select 1')
GO
ALTER PROCEDURE dbo.YourSp
AS
...
通过这种方式,安全设置,注释和其他元标记将在部署期间继续存在。
除了已经说过的内容之外,我还希望添加不同的方法并提倡使用差分脚本部署策略。 Instead of making a stateful script that always checks the current state and acts based on that state, deploy via a series of stateless scripts that upgrade from well known versions。我已经使用了这个策略,因为我的部署脚本现在都是'如果'免费的,所以它付出了很大的时间。
我有一个存储过程,使客户扩展验证,如果它存在,我不想改变它,如果没有我要创建它,最好的办法,我发现:
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
从SQL Server 2016 CTP3
您可以使用新的DIE语句,而不是大IF
包装
语法:
DROP {PROC | PROCEDURE} [IF EXISTS] {[schema_name。 ] procedure} [,...N]
查询:
DROP PROCEDURE IF EXISTS usp_name
更多信息here
下面的代码将检查存储过程是否已经存在与否。
如果它存在,它会改变,如果不存在,它会创建一个新的存储过程为您提供:
//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
这是可行的,但它去除施加到存储过程更改安全性。 – Andomar 2009-06-02 06:42:15
安全更改也应该是脚本的一部分。这样,它将得到适当的记录。这是正确的方法。 – 2012-01-20 16:16:59
@EnderWiggin除非安全实现在设计时不知道......如果开发人员不知道哪些用户需要执行权限? – 2013-11-22 05:54:21