1. ホーム
  2. sql

[解決済み】ストアドプロシージャを作成する前に存在するかどうかを確認する方法

2022-03-28 06:04:53

質問

クライアントがデータベース管理機能を実行するたびに実行しなければならないSQLスクリプトがあります。このスクリプトには、クライアントのデータベースでストアドプロシージャを作成することが含まれています。 これらのクライアントの中には、スクリプトの実行時にすでにストアドプロシージャを持つものもあれば、そうでないものもあるかもしれません。不足しているストアドプロシージャをクライアントデータベースに追加してもらう必要がありますが、T-SQL構文をいくら曲げても、以下のような結果になります。

CREATE/ALTER PROCEDURE」は、クエリーバッチの最初のステートメントでなければなりません。

作成前にドロップするとうまくいくと読んだことがありますが、そのやり方は好きではありません。

IF EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND name = 'MyProc')
DROP PROCEDURE MyProc
GO

CREATE PROCEDURE MyProc
...

ストアドプロシージャの存在チェックを追加し、存在しない場合は作成し、存在する場合は変更するにはどうすればよいですか?

どのように解決するのですか?

クエリを実行できる場所であれば、どこでも手続き型コードを実行することができます。

の後をすべてコピーするだけです。 AS :

BEGIN
    DECLARE @myvar INT
    SELECT  *
    FROM    mytable
    WHERE   @myvar ...
END

このコードはストアドプロシージャが行うことと全く同じことを行いますが、データベース側には保存されません。

の匿名プロシージャと呼ばれるものによく似ていますね。 PL/SQL .

更新しました。

質問のタイトルが少しわかりにくいですね。

もし、プロシージャが存在しない場合にのみプロシージャを作成する必要があるのであれば、あなたのコードはちょうどよいものです。

以下は SSMS は、createスクリプトで出力されます。

IF EXISTS ( SELECT  *
            FROM    sys.objects
            WHERE   object_id = OBJECT_ID(N'myproc')
                    AND type IN ( N'P', N'PC' ) ) 
DROP …
CREATE …

更新しました。

スキーマを含める場合の例です。

IF EXISTS ( SELECT * 
            FROM   sysobjects 
            WHERE  id = object_id(N'[dbo].[MyProc]') 
                   and OBJECTPROPERTY(id, N'IsProcedure') = 1 )
BEGIN
    DROP PROCEDURE [dbo].[MyProc]
END

上の例では dbo がスキーマです。

更新しました。

SQL Server 2016+では、次のようにすればよい。

CREATE OR ALTER PROCEDURE dbo.MyProc