如果存儲過程存在或不存在,則必須編寫一個部署腳本,該腳本將起作用。即如果它存在,那麼我需要改變它,否則創建它。如何檢測存儲過程是否已存在
如何在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