如果在SQL中不存在存储过程,如何创建存储过程

时间:2012-07-25 13:21:40

标签: sql sql-server sql-server-2008 tsql stored-procedures

我试过这个:

if object_id('a_proc22') is not null
CREATE PROCEDURE a_proc22 AS SELECT 1
go

但它给我一个语法错误。

但这似乎在编译:

if object_id('a_proc22') is not null
EXEC('CREATE PROCEDURE a_proc22 AS SELECT 1')
go

为什么第一个不正确?

5 个答案:

答案 0 :(得分:2)

我猜这个错误就像“CREATE / ALTER PROCEDURE必须是查询中的第一个语句”,所以,这就意味着CREATE PROCEDURE必须是第一个查询中的语句。如果你将它包装在EXEC上,那么当它被执行时,它就是该查询的第一个语句,这就是它工作的原因。

答案 1 :(得分:1)

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[a_proc22]')
           AND TYPE IN (N'P', N'PC'))
DROP PROCEDURE [dbo].[a_proc22];
GO

CREATE PROCEDURE [dbo].[a_proc22]
AS
BEGIN 

-- Code here

END
GO

答案 2 :(得分:0)

您的第一个语句是错误的,因为在if条件之后您无法放置创建/更改过程语句。 试试这个

if Exists(select * from sys.procedures  -- if exists then drop it
    where name = 'a_proc22')
    Drop procedure a_proc22
    GO
    CREATE PROCEDURE a_proc22 -- create the new procedure
    AS
    SELECT 1
    go

答案 3 :(得分:0)

if object_id('a_proc22') is not null
drop procedure a_proc22 
go
create procedure a_proc22 
AS 
SELECT 1 

GO是重要的事情,在丢弃之后,你不能先创建,我想出于安全目的进行一些SQL验证。

答案 4 :(得分:-1)

IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[a_proc22]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[a_proc22]
--and create here... Or you can remove the drop and create with if not exists
GO