2012-02-24 37 views
3

我正在通過interatively在SQL Server 2008中編寫存儲過程。當使用SQL Server Management Studio時,每當我進行更新時,我都必須手動刷新Programmability文件夾,然後右鍵單擊,然後刪除,然後單擊確定。我也可以運行查詢來刪除存儲過程。在SQL Server中自動刪除舊的存儲過程

當第一次執行代碼(來自實際的存儲過程代碼,而不是執行命令)時,是否有一些函數可以放入存儲過程中,如果存在,則檢查是否存在現有的存儲過程,然後DROP並用新代碼替換?

或者,由於版本控制,這是一個壞主意嗎?

+2

爲什麼在編寫存儲過程時不要使用['ALTER PROCEDURE'](http://msdn.microsoft.com/en-us/library/ms189762.aspx)語法? – Justin 2012-02-24 17:13:19

回答

6

您可以將其添加到過程腳本的頂部。 (只是與真實值替換OWNERNAME和PROCNAME。

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[OwnerName].[ProcName]') AND type in (N'P', N'PC')) 
DROP PROCEDURE [OwnerName].[ProcName] 
GO 

或者你可以寫ALTER PROC,但如果你保存工作作爲腳本稍後部署到數據庫,這可能是一個問題,可能沒有程序

順便說一句,你總是可以有SQL服務器通過在現有的程序右擊選擇Script Stored Procedure as -> DROP and CREATE to -> ...

您也可以使用模板資源管理器按Ctrl + Alt + T並生成該爲你使用Drop Stor編程序模板(下面是默認值),然後使用Query -> Specify Values for Template Parameters

-- ======================================================= 
-- Drop Stored Procedure 
-- ======================================================= 

-- Drop stored procedure if it already exists 
IF EXISTS (
    SELECT * 
    FROM INFORMATION_SCHEMA.ROUTINES 
    WHERE SPECIFIC_SCHEMA = N'<Schema_Name, sysname, Schema_Name>' 
    AND SPECIFIC_NAME = N'<Procedure_Name, sysname, Procedure_Name>' 
) 
    DROP PROCEDURE <Schema_Name, sysname, Schema_Name>.<Procedure_Name, sysname, Procedure_Name> 
GO 
4

使用ALTER而不是CREATE,這樣你就修改現有的存儲過程,你沒有放棄,然後重新創建。

+2

該alter還將維護您在proc上授予的任何特定權限。 – Vinnie 2012-02-24 17:29:07

0

當我創建我的存儲過程腳本我常先於每個存儲過程的定義與類似如下(我見過的變化):

PRINT 'Creating stored procedure "sp_tbl_multipart_msg_part_move".' 
IF EXISTS (SELECT * FROM sysobjects WHERE id = object_id('sp_tbl_multipart_msg_part_add')) 
    DROP PROCEDURE dbo.sp_tbl_multipart_msg_part_move 
GO 
CREATE PROCEDURE dbo.sp_tbl_multipart_msg_part_move 
--SP Code Goes Here 
END 
GO 

然後,我可以每次只運行整個腳本,它在重新創建它們之前放下proc。

我認爲這是你的意思。

1

首先檢查所有腦幹:

if exists(select * from sys.procedures where object_id = OBJECT_ID('dbo.procname')) 
    drop procedure dbo.procname 

這樣做,你殺死procedute已經授予或拒絕的權限,所以 - 更好的辦法不使用一滴/創建方案,但檢查對非存及其alter

if NOT exists(select * from sys.procedures where object_id = OBJECT_ID('dbo.procname')) 
    EXEC('CREATE PROC dbo.procname as') 
GO 
ALTER PROCEDURE dbo.procname 
... 
1

在SQL Server 2008 Management Studio中我用鼠標右鍵單擊該存儲過程 - 選擇腳本存儲過程作爲 - 選擇下降和創造 - 新的查詢編輯窗口。

我們已經在我們所有的程序,這個代碼上面已經提到:

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[Name].[spName]') AND type in (N'P', N'PC')) 
DROP PROCEDURE [Name].[spName] 
GO 

因此,我可以做出改變,以在查詢窗口中的程序,從命令工具欄中執行它拿起我變化。然後我轉到存儲過程並右鍵單擊執行它。不需要刷新或刪除。