私はこれを試しました:
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 object_id('a_proc22') is not null
drop procedure a_proc22
go
create procedure a_proc22
AS
SELECT 1
ドロップ後、GOはここで重要なことです。最初に作成することはできません。セキュリティ上の理由から、SQL検証をいくつか行うと思います。
if 条件の後に create/alter プロシージャ ステートメントを配置できないため、最初のステートメントでエラーが発生しています。これを試して
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 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