2011-02-14 60 views
2

我将所有的T-SQL DDL语句存储在版本控制下的Visual Studio数据库项目中。这些脚本是为了始终运行没有错误,所以他们包括降/创建语法像这样:复制场景中SQL Server存储过程的CREATE/ALTER语法?

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 

麻烦的是,我们已经搬到了复制方案,所以我可以不再使用我滴/创建语法因为您不能删除标记为复制的对象。现在我需要创建proc,如果它不存在,或者修改它,如果它存在。而且我无法反转我的IF逻辑,因为我无法在IF声明中创建proc - 我只能删除它。有任何想法吗?


编辑: 由于亚当的答案,这里是我结束了使用。不知道为什么我不考虑执行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 

回答

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 

请注意,您必须使用sp_ExecuteSql(或等价的东西)这里,因为create procedure必须是批处理的第一条语句。

+0

哦,我的天啊。我必须要完全的大脑冻结才能执行SQL语句。谢谢。 – mattmc3 2011-02-14 15:25:12

1

总结创建存储过程到EXEC,你可以扭转你如果逻辑:

exec (N'create procedure... 
1

像亚当的回答一个例子是这样的:对于表

declare @ID int 
select @ID = ID from sysobjects where OBJECT_NAME(ID)='Proc1' and USER_NAME(uid) = 'dbo' 
if @ID is null 
begin 
    exec('create procedure dbo.Proc1 as') 
end 
else 
begin 
    if OBJECTPROPERTY(@ID,N'IsProcedure')=0 or OBJECTPROPERTY(@ID,N'IsMSShipped')=1 
    begin 
     RAISERROR('An object called dbo.Proc1 exists in the database, but is of the wrong type',16,1) WITH NOWAIT 
    end 
end 
go 
ALTER procedure [dbo].[Proc1] 
    /* Body of procedure */ 
0

添加例子功能:

IF objectproperty(object_id('dbo.udf_MyFunction'), 'IsTableFunction') is null 
    EXEC sp_ExecuteSql N'CREATE FUNCTION dbo.udf_MyFunction() RETURNS @X TABLE (Id int) AS BEGIN RETURN END' 
GO 

and SCALAR FUNCTIONS:

IF objectproperty(object_id('dbo.udf_MyFunction'), 'IsScalarFunction') is null 
    EXEC sp_ExecuteSql N'CREATE FUNCTION dbo.udf_MyFunction() RETURNS int AS BEGIN RETURN 0 END' 
GO