我正在SQL Server 2008中编写存储过程。使用SQL Server Management Studio时,每次我进行更新时都必须手动刷新Programmability文件夹,然后右键单击,然后删除,然后单击确定。我也可以运行查询来删除存储过程。
我是否可以在首次执行代码时(从实际的存储过程代码,而不是exec命令)进入存储过程,这将检查是否存在现有存储过程,如果是,则{{ 1}}并替换为新代码?
或者,由于版本控制,这是一个坏主意吗?
答案 0 :(得分: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
,但如果您将工作保存为脚本以便稍后部署到可能没有该过程的数据库,则可能会出现问题
顺便说一句,您可以通过右键单击现有过程并选择Script Stored Procedure as -> DROP and CREATE to -> ...
您还可以使用模板资源管理器 Ctrl + Alt + T 并使用Drop Stored Procedure模板(以下是默认设置),然后使用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
答案 1 :(得分:4)
使用ALTER
代替CREATE
,这样您就可以修改现有的存储过程,您不必删除然后重新创建。
答案 2 :(得分:1)
首先检查存在:
if exists(select * from sys.procedures where object_id = OBJECT_ID('dbo.procname'))
drop procedure dbo.procname
但这样做可以杀死已经授予或拒绝的程序权限,所以 - 更好的方法是不使用drop / create方案,但要检查NON-existance和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
...
答案 3 :(得分:1)
在SQL Server 2008 Management Studio中,我右键单击存储过程 - 选择脚本存储过程作为 - 选择drop并创建到 - 新查询窗口编辑器。
我们已在上述所有程序中使用此代码:
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
所以我可以在查询窗口中对过程进行更改,从命令工具栏执行它以获取我的更改。然后我转到存储过程并右键单击执行它。不需要刷新或删除。
答案 4 :(得分: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
然后我可以每次都运行整个脚本,并在重新创建它们之前删除它们。
我认为这就是你的意思。