我试过这个:
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
为什么第一个不正确?
我试过这个:
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
为什么第一个不正确?
我猜这个错误类似于“CREATE/ALTER PROCEDURE 必须是查询中的第一条语句”,所以,这意味着它CREATE PROCEDURE
必须是查询中的第一条语句。如果你把它包装在一个 上EXEC
,那么当它执行时,它就是那个查询的第一条语句,所以这就是它起作用的原因。
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
您的第一条语句给出错误,因为在 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
if object_id('a_proc22') is not null
drop procedure a_proc22
go
create procedure a_proc22
AS
SELECT 1
GO 是下降后的重要内容,您不能先创建,我想出于安全目的进行一些 SQL 验证。
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