[解決済み】ストアドプロシージャを作成する前に存在するかどうかを確認する方法
質問
クライアントがデータベース管理機能を実行するたびに実行しなければならない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
関連
-
[解決済み】「パラメータ@objnameがあいまいか、主張する@objtype(COLUMN)が間違っています」を解決するにはどうすればよいですか?[重複している]。
-
[解決済み】Teradata - 計算中に数値のオーバーフローが発生しました。
-
[解決済み] エラー: 名前解析スクリプトで正しい関数に渡された長さのパラメーターが無効です。
-
[解決済み] "このSqlTransactionは完了しました。もう使用できません。"...設定エラー?
-
[解決済み] SQL Server テーブルにカラムが存在するかどうかを確認する方法は?
-
[解決済み] SQL Server にテーブルが存在するかどうかを確認する
-
[解決済み] SQL Serverでストアドプロシージャ内のテキストを検索する
-
[解決済み] SQL Serverにおける関数とストアドプロシージャの比較
-
[解決済み] テーブルが存在する場合、それを削除するにはどうすればよいですか?
-
[解決済み】すべてのテーブル、ストアドプロシージャ、トリガ、制約、およびすべての依存関係を1つのSQLステートメントで削除します。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】 "指定された集約関数を含まないクエリを実行しようとしました。"
-
[解決済み】Teradata - 計算中に数値のオーバーフローが発生しました。
-
[解決済み】テキストが切り捨てられた、または1つ以上の文字がターゲットコードページで一致しない アンピボットの主キーを含む
-
[解決済み] テスト
-
[解決済み】INTERSECTとINNER JOINは根本的に違うのか?[重複している]
-
[解決済み】ORA-01791: SELECTされた式ではない
-
[解決済み] 2つの列を分割するには?
-
[解決済み] SQLクエリで2つの列から値を引き算する
-
[解決済み] アクセスクエリーエラー(from句のシンタックスエラー)
-
[解決済み] ORA-01821: ISO 8601 のローカルタイム付き日付のフォーマットが認識されないエラー