复制方案中SQL Server存储过程的CREATE/ALTER语法?

mat*_*mc3 2 t-sql sql-server

我将所有T-SQL DDL语句存储在版本控制下的Visual Studio数据库项目中.这些脚本总是在没有错误的情况下运行,因此它们包含一个drop/create语法,如下所示:

use MyDatabase
go
if objectproperty(object_id('dbo.MyProcName'), 'IsProcedure') = 1 begin
    drop procedure dbo.MyProcName as
end
go
-----------------------------------------------------------------------
-- $Id: $
-- Notes: blah blah
-----------------------------------------------------------------------
create procedure dbo.MyProcName as
--...
go
Run Code Online (Sandbox Code Playgroud)

麻烦的是,我们已经转移到复制方案,所以我不能再使用我的drop/create语法了,因为你不能删除标记为复制的对象.现在我需要创建proc,如果它不存在,或者如果它存在则改变它.我无法改变我的IF逻辑,因为我无法在IF声明中创建一个proc - 我只能放弃它.有任何想法吗?


编辑:感谢Adam的回答,这就是我最后使用的内容.不知道为什么我不考虑执行SQL字符串...必须喝更多的咖啡.

use MyDatabase
go
if objectproperty(object_id('dbo.MyProcName'), 'IsProcedure') is null begin
    exec('create proc dbo.MyProcName as')
end
go
-----------------------------------------------------------------------
-- $Id: $
-- Notes: blah blah
-----------------------------------------------------------------------
alter procedure dbo.MyProcName as
    --...
go
Run Code Online (Sandbox Code Playgroud)

Ada*_*son 5

您可以做的是让脚本的第一部分为该过程创建一个存根(如果它不存在),然后将脚本的其余部分转换为ALTER脚本而不是脚本CREATE.

例如:

if objectproperty(object_id('dbo.MyProcName'), 'IsProcedure') <> 1 begin
    exec sp_ExecuteSql N'create Procedure dbo.MyProcName as select 1'
end
go
-----------------------------------------------------------------------
-- $Id: $
-- Notes: blah blah
-----------------------------------------------------------------------
alter procedure dbo.MyProcName as
--...
go
Run Code Online (Sandbox Code Playgroud)

请注意,您必须sp_ExecuteSql在这里使用(或类似的东西),因为create procedure必须是批处理中的第一个语句.