- 締切済み
SQLServer MERGEコマンドについて
初めて投稿させていただきます。 まず、環境に関する情報です。 【環境】 DB:SQLServer2008R2 開発環境:VisualStudio2008 Professional Edition 開発言語:C# C#のプログラムでSQL実行を行うプログラムを作成し、MERGEコマンドを含むSQL文を発行しようとしているのですが、以下のエラーとなってしまいます。 ▼エラー内容 System.Data.SqlClient.SqlException: ストアド プロシージャ '' が見つかりませんでした。 書いたコードはこんな感じです。 ▼ソース内容 public bool MergeData(String strSQL) { try { base.sqlDataAdapter = null; base.OpenConnection(); StringBuilder sqlMerge = new StringBuilder(); //------------------------------------------------------------ // マージ用SQL //------------------------------------------------------------ sqlMerge.Append("MERGE INTO [テーブルA] as T USING [テーブルAtemp] as T2"); sqlMerge.Append(" ON (T.カラム1 = T2.カラム1 and T.カラム2 = T2.カラム2)"); sqlMerge.Append(" WHEN MATCHED THEN"); sqlMerge.Append(" UPDATE SET xxxxx"); ※内容は割愛します sqlMerge.Append(" WHEN not MATCHED THEN"); sqlMerge.Append(" INSERT xxxxx"); ※内容は割愛します //------------------------------------------------------------ // トランザクション開始 //------------------------------------------------------------ base.BeginTransaction(); //------------------------------------------------------------ // 登録用SQL設定 //------------------------------------------------------------ base.SetCommand(sqlMerge.ToString()); //------------------------------------------------------------ // 登録実行 //------------------------------------------------------------ int retValue = base.ExecuteNonQuery(); 「sqlMerge.ToString()」の内容をそのままSQLServerManagementStudioで実行すると正常に処理できることは確認できています。 なぜ上記エラーが出てしまうのか?が分かりません。 お分かりの方がいらっしゃいましたらご教授お願いします。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
base.SetCommand メソッドの実装がわからないと回答しようがありません。このメソッドを実装しているクラスの継承元クラスの名前は何でしょうか。 私の予想では、このクラスは開発プロジェクトなどで作成した独自のものではないかと思います。もしそうであるならば、この質問はそのクラスを作った人(またはチーム)に聞くか、マニュアルを読んで下さいとしか言いようがありません。
お礼
早速回答を頂きありがとうございました。 ご指摘のとおり、base.SetCommandメソッドを確認したところ、以下のような判定でプロシージャかどうかを判定しており、MERGEだとプロシージャの分岐に入ってしまっていました。 条件に「MERGE」を追加したところ、問題なくSQL実行させることができました。 if (this.CommandText.ToUpper().StartsWith("SELECT ") || this.CommandText.ToUpper().StartsWith("UPDATE ") || this.CommandText.ToUpper().StartsWith("INSERT ") || this.CommandText.ToUpper().StartsWith("DELETE ") || this.CommandText.ToUpper().StartsWith("EXEC ") || this.CommandText.ToUpper().StartsWith("SET ") || this.CommandText.ToUpper().StartsWith("MERGE ")) { // テキストと判断 this.sqlCommand.CommandType = CommandType.Text; } else { // ストアドと判断 this.sqlCommand.CommandType = CommandType.StoredProcedure; } ありがとうございました。