MERGE
ステートメントが役立つ場合があります。MERGE
条件付きINSERT
/としましょうUPDATE
。単一のステートメントINSERT
では、存在しない場合は新しいユーザーを作成でき、存在する場合はそれのみを作成できUPDATE
ます。
他の人が書いたように: ストアド プロシージャは動的 SQL よりもはるかに優れています。にラップMERGE
しCREATE PROCEDURE
ます。
現実世界では、アプリ/ウェブアプリでのユーザー インタラクション/ワークフローから、1 つまたは 2 つの手順が必要かどうかがわかります。
シナリオ A)
- ユーザーデータを教えてください
- 私はあなたのためにアカウントを作成するか、それを更新します (1 つのストアド プロシージャ)
シナリオ A ではMERGE
、条件付きINSERT
/を行いUPDATE
ます。
シナリオ B)
- ユーザーデータを提供して、サインアップするか、単にログインするかを決定します
- (サインアップしたい) - 指定されたログインが無料かどうかを確認する (最初のストアド プロシージャまたは単にクエリ)
- (無料です。サインアップしてください!) - アカウントを作成しますが、ログインがまだ無料かどうかをもう一度確認する必要があります(2番目の手順)
シナリオ B では、ログインの存在を確認してから行うINSERT
か、(より良い)ブロックINSERT
で行うことができます。有用なメッセージ/状態をブロックで実行TRY .. CATCH
できるため、(return param の代わりに) SQL から「例外」をスローし、アプリケーション コードでキャッチすることにより、アカウントの作成に関する問題を報告できます。このロジックは、コーディングでより役立つ場合があります。RAISERROR
CATCH