• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:レコードセット抽出後、エラーが出てカーソルの移動ができません。)

SQLServer2000でのクエリ実行エラーについて

このQ&Aのポイント
  • SQLServer2000を利用してASPで開発を行なっている際に、レコードセット抽出後にエラーが発生し、カーソルの移動ができない状態になります。
  • このエラーは、サブクエリの結果によって発生し、別の表領域での処理ではエラーが表示されません。
  • 解決方法としては、サブクエリの結果によってカーソル操作を行うかどうかを判断し、エラーが発生しないように条件を調整する必要があります。

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

  • ベストアンサー
  • Azzuri
  • ベストアンサー率68% (34/50)
回答No.3

基本的には動くと思いますが、動的にレコードを 取得した後でTBL_Aのデータが変更されたという ことはないですよね。 データアクセスのオブジェクトの使用方法に起因 する問題のようにも思えますが。 回避策としては、あまり良くないですが、 select fldA1 from TBL_A where fldA2 = *** の結果を変数に格納して、 select fldB1, fldB2, case fldB3 when '固定値' then '1' else '' end as fldAB1 from TBL_B where fldB3 = **** とすることでしょうか。

eitetsu
質問者

お礼

その後、確認を続けていますが、データ取得のメソッドを変更することで、データの取得自体は可能であることがわかったため、データベース側の調整・確認を進めることになりました。 SQLの記述等、参考になりました。 ありがとうございます。

その他の回答 (2)

  • Azzuri
  • ベストアンサー率68% (34/50)
回答No.2

すみません。間違えました。 複数の結果が返ってくると失敗するのではなく、 WHEN ~ には論理式が入るため、構文エラーになります。 あと、CASE式の結果の型を統一して下さい。 以下に例を示します。 select fldB1, fldB2, case when (select fldA1 from TBL_A where fldA2 = ***) IS NOT NULL then '1' else '' end as fldAB1 from TBL_B where fldB3 = **** 別バージョン select B.fldB1, B.fldB2, case A.fldA1 when NULL then '1' else '' end as fldAB1 from TBL_B B,(select fldA1 from TBL_A where fldA2 = ***) A where B.fldB3 = ****

eitetsu
質問者

補足

申し訳ありません、検索条件のSQLの例示が間違っていました。 以下に、正しいクエリを記します。 --------------------------- select fldB1, fldB2, case fldB3 when (select fldA1 from TBL_A where fldA2 = ***) then 1 else '' end as fldAB1 from TBL_B where fldB3 = **** --------------------------- ()の中のサブクエリの結果は必ず一つの結果が戻るという前提条件は成立しています。 (***の部分は、TBL_Aの主キーで、重複を許さないことと、あらかじめその***が存在することを確認してから検索する為) この場合でも、上記のようなエラーは発生するでしょうか。 また、サブクエリの抽出結果としては同じ値が返るはずの条件で***を変えて実行した場合でも、エラーが出るものと出ないものが存在している状態です。 ============================ 別バージョンの宣言の方法は知りませんでした。 早速今後取り入れたいと思います。 また、型の一致についても、対応するようにします。

  • Azzuri
  • ベストアンサー率68% (34/50)
回答No.1

(select fldA1 from TBL_A where fldA2 = ***)で、 複数の結果が返ってくると失敗します。 それと、以下のSQLのほうが負荷が少ないと思います。 select B.fldB1, B.fldB2, case when A.fldA1 then 1 else '' end as fldAB1 from TBL_B B,(select fldA1 from TBL_A where fldA2 = ***) A where B.fldB3 = ****

eitetsu
質問者

補足

No2.の記述が更に間違っていたので、こちらに正しいクエリを書きます。 --------------------------- select fldB1, fldB2, case fldB3 when (select fldA1 from TBL_A where fldA2 = ***) then 1 else null end as fldAB1 from TBL_B where fldB4 = #### --------------------------- ↑***と####は別の値が入ります。

関連するQ&A