SQLServer2000のストアドプロシージャの条件処理で問題が発生しています

このQ&Aのポイント
  • SQLServer2000のストアドプロシージャで、Select結果によって違う値を返す処理を行っていますが、片方の条件は正しく処理されず、もう片方は正常に処理されます。
  • ROWCOUNTが0の場合にはErrorCodeが1となるように設定していますが、ROWCOUNTが20以上の場合にはErrorCodeが2とならず、どちらの条件が拾われるか理解できません。
  • 構文チェックでは正常な状態であるため、ELSEの書き方が問題なのか不明です。解決方法をご存知の方、教えてください!
回答を見る
  • ベストアンサー

ELSE先の条件に引っかからない

いつもお世話になっています。 SQLServer2000のストアドプロシージャでSelect結果によって 違う値を返そうとしています。    SET @ErrorCode=0       IF @@ROWCOUNT=0    BEGIN         PRINT 'データ無し'         SET @ErrorCode=1         RETURN    END    ELSE    IF @@ROWCOUNT>=20    BEGIN         PRINT '20件以上のデータ'         SET @ErrorCode=2         RETURN    END と書き、ROWCOUNT=0の時はErrorCode=1が帰ってくるのですが ROWCOUNT>=20の時にErrorCode=2が帰ってきません。 なぜ片方の条件は拾えて、もう片方は無視されるのでしょうか。 構文チェックでも正常なので、「ELSEの書き方が悪いのかな」までしか わかりません。 どなたかおわかりの方、教えてください!!

質問者が選んだベストアンサー

  • ベストアンサー
  • kumagoro-
  • ベストアンサー率57% (36/63)
回答No.1

「IF @@ROWCOUNT = 0」というステートメントを実行した時点で@@ROWCOUNTには0が入ります。 ですから「ELSE IF @@ROWCOUNT >=20」部分には入りません。 これを解決するには  SET @intRowCount = @@ROWCOUNT  IF @intRowCount = 0  BEGIN    PRINT 'データ無し'    SET @ErrorCode = 1    RETURN  END  ELSE IF @intRowCount >= 20  BEGIN    PRINT '20件以上'    SET @ErrorCode = 2    RETURN  END とすれば大丈夫です。

lovelypooh
質問者

お礼

早速の回答ありがとうございます。 IF @@ROWCOUNT=0でダメなんですね。 普通のIF~ELSE文と違うなぁとは思いましたが、 条件文に使用しただけで@@ROWCOUNTが変わるとは・・・。 初心者イジメとしか思えませんね(苦笑)。 おかげさまでできました。 ErrorCode=2が帰って来た瞬間、思わず「ワォ」と口走るくらいありがたかったです。 また機会がありましたら、教えてください(ペコリ)。

関連するQ&A

  • ストアドプロシージャのbegin、end

    下記の様なストアドプロシージャを作成し、VB側から実行させています。 どうしても、★SQL文2★の後のreturn文を実行してくれません。 (VB側ではreturn値が0と判断します。) このreturn文を★SQL文2★の前に移動すると、return値が-1として正常に取得できます。 begin、endのブロックの記述に何か間違いがあるのでしょうか? 環境:sqlserver2000,windows2000,vb6 よろしくお願いします。 CREATE PROCEDURE [sp_AAA] @PARAM1 varchar(16) AS begin if (~) begin ★SQL文1★ if (@@ERROR <> 0) begin return @@ERROR end end ★SQL文2★ return -1 ←ココ end

  • ストアド内で動的にSQLを作る際のLIKE演算子シングルクォーテーションの数

    現在Access2003とSQLServer2005ExpressEditonで勉強中の者です。 ストアドプロシージャを動的に作成したいと思い 以下のページを参考に、NorthwindCS.adpはダウンロードせず 自前で簡単に環境を作ってストアドプロシージャをつくりテストに成功しました。 http://support.microsoft.com/kb/286828/ja そこで「もし検索対象のテーブルに摘要欄があり、"未"を含む検索をしたい場合はどうすればよいか」と思い、摘要フィールド(Varchar)を作成してストアドプロシージャに変数@TEKIYO(Varchar)を作り、以下の行を足しました。 ---------------------------------------------------------------- --摘要の検索条件がNULLかどうかを確認します。 --ここに値が含まれている場合WHERE句を作成します。 IF @TEKIYO IS NOT NULL BEGIN IF @SQLSTRING IS NOT NULL BEGIN SELECT @SQLSTRING = @SQLSTRING + ' AND TEKIYO LIKE ''%''' + @TEKIYO + '%''' END ELSE BEGIN SELECT @SQLSTRING = 'WHERE TEKIYO LIKE ''%''' + @TEKIYO + '%''' END END ---------------------------------------------------------------- adpの検索フォーム摘要欄に「未」と入力し実行ボタンを押すと「実行時エラー102 '未'付近に不適切な構文があります」と出てしまいました。 シングルクォーテーションの打ち方が間違っているのだろうと色々調べたり、打ち方を変えてみたりしたのですが、解決できず悩んでおります。 正解はどうなのでしょうか?教えてください。 なにとぞよろしくお願いいたします。

  • 楽観的排他処理のためViewStateに更新日時を保持したいのですが・・・

    はじめまして。 今回の質問なのですが、ViewStateに更新日時を保持し、後で、排他処理のため、ストアドプロシージャーで排他処理をしたいと思っています。 とりあえず、Page_Load時に、「ViewState["haita"] = (DateTime)dtTemp.Rows[0]["更新日時"]」という風にdatatableから更新日時を取得します。そして、更新ボタンクリックで 「SqlParameter p11 = cmd.Parameters.Add("@haita",System.Data.SqlDbType.DateTime); p11.Value = ViewState["haita"];」 としてストアドプロシージャーの中で排他処理を行いたいのですが、どうもViewStateでデータの比較ができてないみたいです。 ちなみにストアドの中身は、 CREATE PROCEDURE AA_Table @haita datetime AS SELECT * FROM M_科目マスタ WHERE コースコード=@couse AND 科目コード=@k_kode AND 年度=@nendo AND 年次=@nenji AND 更新日時=@haita IF @@ROWCOUNT<1 BEGIN RETURN(-1) END ELSE BEGIN UPDATE M_科目マスタ SET 科目名 = @k_name, 科目名略称 = @k_ryaku, 科目責任者 = @k_Person, 単位 = @tani, 更新日時 = @up, 更新ユーザー名 = @koushinsya WHERE コースコード = @couse AND 年度 = @nendo AND 年次 = @nenji AND 科目コード = @k_kode RETURN(0) END GO です。 どうやってもRETURN(-1)が返ってきてしまいます。 どなたか、参考になる意見お願いします!

  • @@ERRORと@@ROWCOUNT併用について

    ストアドプロシージャ内で@@ERRORと@@ROWCOUNTを併用で使用しています。下記URLでは問題ないかの様に記述されていますが、当方の環境では×です。下記の様なストアドです。 declare @errNo int insert into ~ set @errNo = @@ERROR if ( @errNo <> 0 ) return @errNo if ( @@ROWCOUNT = 0 ) return 100 上記では、insert時のエラーは取得でき、@@ROWCOUNTは正常に1件挿入された場合でも、0が取得され、結果return 100が返される事になります。おそらく、@@ROWCOUNTの前でエラーハンドリングしている為、そこでリセット?されていると思われます。逆に、@@ROWCOUNTのハンドリングをエラーハンドリングより前にすると、今度は@@ROWCOUNTは正常に挿入された数が返ってくるものの、エラーハンドリングはされません。(おそらく、@@ROWCOUNTのハンドリング時に@@ERRORがリセットされる為と思われる。)この様な場合どうすればいいのでしょう?因みに以下のURLではOKらしいですが。。。 http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/acdata/ac_8_con_05_8oc2.asp

  • oracleのfunctionで戻り値複数個

    oracleのストアドプロシージャのファンクションについてですが、 ファンクションは、戻り値を返すことができますが、 それを、複数個返すことはできるのでしょうか。 CREATE [OR REPLACE] FUNCTION ファンクション名(引数 IN データ型[, ...]) RETURN 戻り値の型 IS 宣言部 BEGIN 処理部 END ; お願いします。

  • ストアドファンクションがうまく作成できない

    SQL Server 2005 にて、 以下のようなストアドファンクションを作成しようとしても、 「メッセージ 156、レベル 15、状態 1、プロシージャ TestKansu、行 30 キーワード 'end' 付近に不適切な構文があります。」 といったエラーメッセージが表示されてしまい、 うまく作成できません。。 文法など、いろいろ調べてみたところ、特に問題なさそうな 感じではあるのですが。。 どこに問題があるのか、どなたかご教授願えないでしょうか? なにとぞ、よろしくお願いいたします。 -------------------------------- use tempdb go -- 呼び出し形式 create function TestKansu ( @Date as datetime, @Type as varchar(1) ) returns @ReturnTable table ( StartDate varchar(8), EndDate varchar(8) ) as begin if @Type is null begin raiserror('正しいtypeを指定してください',-1,-1) end if @Date is null begin SET @Date = getdate() end if @Type = '0' begin insert into @ReturnTable select convert(varchar(8), dateadd(dd ,-2 ,@Date), 112) as StartDate, convert(varchar(8), dateadd(dd ,-2 ,@Date), 112) as EndDate, end if @Type = '1' begin insert into @ReturnTable select convert(varchar(8), @Date, 112) as StartDate, convert(varchar(8), @Date, 112) as EndDate end return end --------------------------------

  • MySQLのストアドプロシージャについて

    MySQL5.6のストアドプロシージャが返すSELECT結果のフェッチ方法について教えてください。 delimiter $ create procedure sample_proc() begin select * from TEST_TBL; end$ の様なストアドプロシージャがあり、これを他のストアドプロシージャから呼び出して、 ループしながらフェッチしたいのですが、どうすればよいでしょうか。

  • 【SQLServer】何も処理しない場合の記述について

    【SQLServer】何も処理しない場合の記述について お世話になってます。 ご存知の方いらっしゃいましたら教えてください。 Oracleでは、IF文の中で何も処理したくない場合、明示的にNULLと書けば、コンパイルできます。 IF XXXXX THEN A = 100 ELSE -- 何もしない NULL END たとえ何も処理しない場合でも、明示的にELSE句を 書きたい場合は、 SQLServerの場合、何をかけばよいのでしょうか? 今のところ下記のように、ELSEの場合は意味の無い処理を記述しています。 IF XXX BEGIN A=100 END ELSE IF BEGIN -- 何も処理しない A = A END A=Aは意味の無い処理なのですが、削除するとコンパイルが通らなくなってしまうのでやむなく記述してます。 どなたかいいアイデアありましたらご教授くださいませ。 よろしくおねがいします。

  • ストアドプロシージャの引数にフィールド名を指定したい

    以下のようにストアドプロシージャを作成し、 ------------------------------------------------------------ CREATE FUNCTION test(integer) RETURNS integer AS'  DECLARE   aaa ALIAS FOR $1;  BEGIN   IF aaa BETWEEN 1 AND 5 THEN    RETURN 5;   ELSIF aaa BETWEEN 6 AND 10 THEN    RETURN 10;   ELSIF aaa BETWEEN 11 AND 15 THEN    RETURN 15;   END IF;  END;' LANGUAGE 'plpgsql'; ------------------------------------------------------------ 以下のようなSQL構文でこのプロシージャを使用したいと思っています。 ------------------------------------------------------------ select test(フィールド名) from テーブル名; ※「フィールド名」のフィールドにはinteger型のデータが入っています。 ------------------------------------------------------------ が、このSQLを実行すると以下のようなエラーが出ます。(CSE使用) ------------------------------------------------------------ WARNING: Error occurred while executing PL/pgSQL function test WARNING: at END of toplevel PL block WARNING: Error occurred while executing PL/pgSQL function test WARNING: at END of toplevel PL block SQL実行中に以下のエラーが発生しました。 WARNING: at END of toplevel PL block ------------------------------------------------------------ このように、ストアドプロシージャの引数にフィールド名を指定することはできないのでしょうか。 どなたかご教示ください。

  • ストアドでのwhile文の利用法

    SQLServerでのストアドについてはこちらでうかがってもよろしいのでしょうか? ストアド内にてwhileでのループ文作成についてなんですが、 以下のようなストアドでSELECT内でA.NO1....とあるとおもうのですが、 これを@numRankの数だけ、A.NO(フィールド)を増やしたいのですが、 ここからどのようにつくればよろしいのでしょうか? CREATE PROCEDURE usp_Enquete @ask_idvarchar(10) AS DECLARE @strvarchar(1000) DECLARE @numRankint DECLARE @Counterint BEGIN SELECT @numRank = count(*) FROM B_Answer WHERE ask_id = @ask_id END SET NOCOUNT ON SET @Counter = 1 WHILE @Counter <= @numRank BEGIN SET @str = ' SELECT count(ansList.NO1) AS NumAns, A.NO1, A.NO2, A.NO3 FROM ・ ・ ・