我试过这个:
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
为什么第一个不正确?
答案 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