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

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

レコードセット抽出後、エラーが出てカーソルの移動ができません。

SQLServer2000を利用して、ASPで開発を行なっています。 2つのテーブルA,Bがあり、Aに対するクエリをサブクエリとした、Bへのクエリを実行した結果をレコードセットとして取得し、カーソルの移動を行なおうとしたところ、 「カーソルが宣言された後にテーブル スキーマが変更されたので、カーソル操作を完了できませんでした。」とのエラーが表示され、カーソルの移動が行なえない状態となっています。 このエラーは、サブクエリの結果によって、出る、出ないがあるのですが、データ的には、出るデータと出ないデータの差異はほとんどありません。 (中に入っているデータは若干異なっていますが、型としては全く同じです。) また、検証用に設置した別の表領域で処理を行なったところ、一切エラーは表示されていません。 そもそも、このエラーはどのような原因で発生し、どういった方法で解決することができるのでしょうか。 よろしくお願いいたします。 なお、下に、その際に使用したクエリの概要を記します。 select fldB1, fldB2, case when (select fldA1 from TBL_A where fldA2 = ***) then 1 else '' end as fldAB1 from TBL_B where fldB3 = ****

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

  • ベストアンサー
  • 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

  • SQL サブクエリで抽出したカラムについて

    サブクエリで抽出したカラムを 本クエリでの結果と一緒に表示したいのですが どのように実現してよいかわからず困っております。 詳細としては、下記のようなことをしたいと考えております。 文中の1)と2)は文章下部にあるSQLを指しております ----------------------------------------------------------- 最初は、1)のように凄く単純なSQLでよかったのですが 仕様が変わり、TBL2で取得した新しいカラムも一緒に 本クエリでの結果として取得できれば、SQLを2回実行せずに済むなと考えたのですが、 2)のように色々と試行錯誤したのですが、実現できません。 (2)は単なる空想ですが…) そこで、わかる方にお伺いしたいのですが、 副問い合わせで取得した複数カラムの中の1つのカラム【2)でいうところのTBL2.X】 を 2)のように"select TBL1.A , TBL2.X"として、結果を得ることは可能でしょうか。 ただし、 TBL1のカラムAは、TBL2に存在しない TBL2のカラムXは、TBL1には存在しない カラムBは、TBL1、TBL2に存在する の条件となっております 環境はMysqlです テーブル結合の方法も考えたのですが、 TBL2で、日付でソートし、その上位100件だけを 持ってきたいと思ったので、副問い合わせで一気に抽出しようとこの方法を考えまし た お分かりになる方がいらっしゃいましたらよろしくお願いします 1)SQL ------------ select TBL1.A from TBL1 where TBL1.B in ( select TBL2.B from TBL2 where 条件 ) 2)想像SQL(こんな感じの事をしたい) -------------- select TBL1.A , TBL2.X from TBL1 where TBL1.B in ( select TBL2.B , TBL2.X from TBL2 where 条件 order by TBL2.日付 desc limit 100 )

    • ベストアンサー
    • MySQL
  • サブクエリを利用したSQL文から複数の抽出条件

    例えば、以下のようなサブクエリを利用したSQL文があります。 SELECT table_a.* FROM table_a LEFT JOIN (SELECT table_b.* FROM table_b LEFT JOIN table_c ON (table_b.id = table_c.bid) WHERE table_b.type='1') AS tbl ON (table_a.id = tbl.aid) このSQL文にWHERE句で条件を指定したいのですが、サブクエリで指定しているtblテーブルのvalueフィールドが「1」と「20」のものを抽出したいと思います。 WHERE (tbl.value='1' AND tbl.value='20') としても結果が帰って来ません。 これは、WHEREする条件の数だけ、サブクエリでテーブルを作って条件を指定するのでしょうか? 効率が悪そうなので、他の方法があるのではと思いご質問させて頂きました。 お分かりになる方がいれば、よろしくお願いします。

  • ACCESSのSQLの書き方

    ACCESSでのSQL文の書き方を教えてください。 テーブルtbl_Aとテーブルtbl_Bがあり, tbl_Aで得られた数値とtbl_Bで得られた数値を加えたものを結果として表示します。 どう書けばよろしいのでしょうか。どうしてもエラーになってしまいます。 イメージとしてはこんな感じです。 select (select ~~ from tbl_A where ~~)+(select ~~ from tbl_B where ~~) (もしoracleならば,「from dual」というのを最後に付けるんですが。)

  • NOT EXITSを用いたデータ抽出

    以下の様のテーブル内容でb_tblにないa_tblのデータを抽出するにはNOT EXITSを使用したSQLはどの様に記述すればよいでしょうか。尚、NOT INでは以下の様な記載になりますが、これを単純にNOT EXITSに置き換えると同様の結果が得られません。 select distinct a from a_tbl where a not in (select a from b_tbl); a_tblの内容 項目a 10001 10001 11001 12002 13003 13003 13003 14004 14004 15005 15005 16006 16006 16006 17007 18008 18008 18008 b_tblの内容 項目a 10001 11001 13003 15005 17007 結果 12002 14004 16006 18008

  • ACCESSクエリエラー

    ACCESSにてクエリをSQLビューにて直書きにて作成したところ、 『メインクエリのFROM句の予約語EXISTS を使用しないフィールドを複数返すサブクエリを 作成しました。サブクエリの SELECT ステートメントを変更し1つのフィールドだけを指定してください』 と、エラー表示がされました。 クエリは INSERT INTO 売上管理TBL VALUES ( SELECT  date() , 商品名称TBL.ID , 商品名称TBL.個数 , 商品名称TBL.単価 * 商品名称TBL.個数 AS 金額 FROM 商品名称TBL WHERE 商品名称TBL.個数 > 0 ); になっています。

  • 「#エラー」を含んでいても、並べ替えができるようになりたい。

    テーブル1 A-a B-b テーブル2 A-a C-c クエリ1 SELECT Replace(テーブル1![1],"-","") AS 1 FROM テーブル1; クエリ2 SELECT Replace(テーブル2![2],"-","") AS 2 FROM テーブル2; クエリ3 SELECT クエリ1.[1], クエリ2.[2] FROM クエリ2 RIGHT JOIN クエリ1 ON クエリ2.[2] = クエリ1.[1]; ****************************************************************** 各テーブルのクエリを作成し、Replace関数で置換して、 その置換後の各クエリを、さらにクエリを作成して結合しています。 その時に、 テーブル1にはあるのにテーブル2にない値が 「#エラー」となるのですが、 この状態でも並べ替えを出来るようにするにはどうすればいいでしょうか? 他の値にデータ型を変えるのでしょうか? 「#エラー」があるフィールドは並べ替えも出来ないですし、 デザインビューの抽出条件で 「Not Like "#エラー"」 としても 「抽出条件でデータ型が一致しません。」 というエラーになり、データシートビューで表示できません。 アドバイス宜しくお願い致します。

  • ACCESSとORACLEで抽出結果が異なる

    いつもお世話になっております。 ACCESS2000を扱っております。 ACCESSのデータベースにODBCを接続してORACLEの テーブルをリンクテーブルとしてインポートします。 そして、ACCESSのテーブルとORACLEのテーブルを LEFT JOIN を行いクエリーを作成したのですが、 正しい結果が抽出できません。 ただし、ORACLEのテーブル構成・データと全く同一の ACCESSのテーブルを作成し、クエリーを作成したところ 正常に動作しております。 SQLは以下のような内容となっております。 sSQL = SELECT TBL_1.A, TBL_1.B, TBL_1.C FROM TBL_1 LEFT JOIN TBL_2 ON TBL_1.A = TBL_2.A AND TBL_1.B = TBL_2.B AND TBL_1.C = TBL_2.C WHERE TBL_2.A IS NULL AND TBL_2.B IS NULL AND TBL_2.C IS NULL TBL_1がORACLEより引っ張ってきたリンクテーブル、 TBL_2がACCESSに存在するテーブルになります。 以上のSQLで、TBL_2に存在なくTBL_1に存在するレコード、及びTBL_1とTBL_2でキー項目は同じだが 内容が異なるレコードを抽出できると考えているのですが、TBL_2に存在なくTBL_1に存在するレコードしか 抽出できません。 個人的には、処理する件数が多大であることが影響しているのかとも考えているのですが・・・。 (両テーブルともに約20万件レコード) クエリーを分割することで解決はしたのですが、 原因究明を求められておりまして大変困っています。 皆様の知恵を借りたいです。宜しくお願いいたします。

  • 副問合せをするとエラーになってしまいます

    お世話になります PHP+MySQLにて開発しています あるテーブル1とテーブル2を使って テーブル1のデータを列挙したいのですが うまく行かずエラーが出てしまいます 構造は以下のようになっています ----------------- テーブル1 ----------------- ID  DATE  MEMO 0   3/24   aaa 2   3/25   ccc ----------------- テーブル2 ----------------- ID   BUNRUI 0   A 1   B 2   A テーブル2のBUNRUIが'A'の行のID(上で言うと0と2)を テーブル1のID検索条件にして、 かつDATEが'3/24'の行を取得したく思っています 書いたSQL文は SELECT * FROM テーブル1 WHERE date='3/24' AND id IN(SELECT id FROM テーブル2 WHERE bunrui='A') です。 結果としてテーブル1のID=0 DATE=3/24 MEMO=aaa が取れると良いのですが... 「SELECT id FROM テーブル2 WHERE bunrui='」 が不正とエラーが出てしまいます (判り難い説明で申し訳無いです…) 宜しくお願いします

    • ベストアンサー
    • MySQL
  • SQL 表の結合

    SQLで2つの表から条件に合ったデータを取り出し、同じ列に表示させたいのですが、 どうやっても外部結合のようにすることしかできませんでした。 取り出したデータを縦に結合?させることはできるのでしょうか? 例) dataは月の上旬中旬下旬でそれぞれabcとします。 入力値はmonthとdayで、これらからuriageを選択します。 dataの取りうる値はa,b,c,ab,bc,abcとします。    table:A 売上表            table:B 上旬中旬下旬判断 ---------------------------   -----------  key | data | month | uriage   day | data ---------------------------    -----------   1 |  a  |  1  |  500      1 |  a   2 |  ab  |  1  |  800     … |  …   3 |  bc  |  1  |  400     10 |  a   4 |  c  |  1  |  100     11 |  b   5 |  abc |  1  |  900     … |  …   … |  …  |  …  | …     31 |  c ---------------------------    ----------- month = 1 , day =5のとき  table:Bより   SELECT data FROM table:B WHERE day = 5 としてdata "a" を得ます。 この"a"と同じdataを持つuriageを表示させたいので   SELECT uriage FROM table:A   WHERE month = 1 AND data = (SELECT data FROM table:B WHERE day = 5) として  table:query1  --------    uriage  --------    500  -------- を得ました。 ここまでは良いのですが、これに付け加えて、 table:Bから取り出したdata "a"をtable:Aのdataが含むとき(data = a,ab,abcのとき) その全てのuriageを表示させたく、 ワイルドカードを使おうと   SELECT uriage FROM table:A   WHERE month = 1 AND data = %(SELECT data FROM table:B WHERE day = 5)% 等としてみたのですが、上手くいきませんでした。 そこで、別のクエリーを作って   SELECT uriage FROM table:A   WHERE month = 1 AND data = 'ab' AND data = 'abc' として  table:query2  ---------   uriage  ---------    800  ---------    900  ---------- を得ました。 そして、最後に、 得られた2つの表をまとめて  ---------   uriage  ---------    500  ---------    800  ---------    900  --------- としたいのですが、   SELECT uriage, uriage FROM query1, query2 とすると  ------------------   uriage | uriage  ------------------    500  |  800    500  |  900  ------------------ となりますし、UNIONは使い方がよくわからないためシンタックスエラーにしかならず...。 そもそも、縦に結合?はできるのでしょうか??? あれこれ試してみたのですが、詰まってしまったので、 どなたか知恵をお貸しください。

  • WHERE文の中で除算

    SQLのWHERE文の中で計算をしているのですが、「除数が0です」とのエラーがでてしまいます。 同じ計算をSELECT文の中にいれると、エラーにならず、計算結果がでるのですが、どうしてでしょうか? SELECT DATA, (A + B - C) / (A + B) * 100 FROM table ↑この時は計算結果がでます。 SELECT DATA FROM table WHERE (A + B - C) / (A + B) * 100 <= 50.0 ↑「除数が0です」といわれてしまいます。