2009-06-02 48 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 
相關問題