2011-02-14 58 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