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でした。
コメント
CREATE OR ALTER は使えないですか?
SQL Server 2016あたりから
CREATE OR ALTERが使えますね