SQL Server ストアドで「CREATE OR REPLACE」を使う方法

SQL Serverのストアドには、Oracleでよく使われる「CREATE OR REPLACE」がありません。

SQL Serverで「CREATE OR REPLACE」に代わる方法を説明します。

SQL Server ストアドで「CREATE OR REPLACE」を使う方法

SQL Serverには作成&上書きモードがない

SQL Serverのストアドプロシージャを作成するには「CREATE PROCEDURE~」「CREATE FUNCTION~」を使用します。

例えばこんなストアドプロシージャを書きました。

-- プロシージャを作成する 
CREATE PROCEDURE dbo.proA(@iEno int)
AS
BEGIN
 --UPDATE実行
  UPDATE emp 
  SET ord_no = 0
  WHERE empno = @iEno;
END
GO

このCREATE文は新規で作成する場合はこれでいいですが、修正して上書きする際に困ります。

Oracleでは「CREATE OR REPLACE PROCEDURE」とすれば、新規でも上書きでもどちらでも対応できるようになり、これが常識です。ところが、SQL Serverにはありません。(※ SQL Server 2016以降で対応しました。詳細は後述で。)

上書きするときは、「CREATE PROCEDURE」を「ALTER PROCEDURE」にしないといけません。これはかなり面倒です。

プログラムを2つ用意する、もしくは手動で書き換える手間がかかります。

SQL ServerではDROPすればいい

SQL Serverでは「CREATE OR REPLACE」は使えないのが不便ですね。

こういう場合は、一度強制的にストアドを削除(DROP)してからCREATEすればよいかと。

先程のCREATE文を書き換えてみます。

-- プロシージャを削除する 
DROP PROCEDURE dbo.proA
GO

-- プロシージャを作成する 
CREATE PROCEDURE dbo.proA(@iEno int)
AS
BEGIN
 --UPDATE実行
  UPDATE emp 
  SET ord_no = 0
  WHERE empno = @iEno;
END
GO

「CREATE PROCEDURE」の前に「DROP PROCEDURE」でプロシージャーを削除しました。こうすれば、「CREATE」を「ALTER」 に修正する手間が省けます。

しかし、DROPしてからCREATEするまでの間はこのストアドが使えないので注意してください。

時間的には短いですが、常時使用されるストアドプロシージャでの使用はやめた方がよいです。

CREATE OR ALTER

SQL Server 2016以降ではSQL Serverで「CREATE OR ALTER」が使えるようになりました。

-- プロシージャを作成する 
CREATE OR ALTER PROCEDURE dbo.proA(@iEno int)
AS
BEGIN
 --UPDATE実行
  UPDATE emp 
  SET ord_no = 0
  WHERE empno = @iEno;
END
GO

Oracleの「CREATE OR REPLACE」に相当するのが「CREATE OR ALTER」です。これが使えるようになったのは便利ですね!

以上、SQL Serverのストアドで「CREATE OR REPLACE」の代わりのSQLでした。

コメント

  1. より:

    CREATE OR ALTER は使えないですか?

  2. yossy より:

    SQL Server 2016あたりから
    CREATE OR ALTERが使えますね