• ベストアンサー

SQLで 更新できない

ACCESSでSQLを使っています。 その中で 更新(UPDATE)できないものがあります。 (1) SQLでは 1行を複数に分けると上手くいったことあります。  そういうルールは あるのでしょうか? VB上 (2)実行したい例文は strSQL="UPDATE table SET A = B WHERE C=2 " この時、Bに ‘シングルクォーテーション? を加えると Bが 更新されるのですが 実際は Bは変数なので Bの値をAに更新したいのです。 けれど エラーになってしまいます。 1回 フォームのテキストBOXに入れてから  A= Me.BB のようにしたのですが ダメでした。 部分的にしか 表示していないのですが 何か気づく点があればお願いします。

  • cdma
  • お礼率36% (91/247)

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

  • ベストアンサー
  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.4

こんにちは。maruru01です。 横からですが、気になったので。 >A=B と A ='" & B & "' とは どう違うのでしょうか? >'"&で囲めば 変数を使用できるということでしょうか? "~A="は単なる文字列です。SQLの実行する時に意味を持つだけで、変数strSQLに格納されているだけでは、Bに入っている"文字"と同じです。 その文字列とBという変数をそのままくっつけても意味がありません。 それでは単に"B"という文字と等しい(=)としているにすぎません。変数Bとは無関係になります。 文字列(及び文字列変数)どうしの結合は&を使わないといけません。 つまり、「'" & 」で囲んでいるのではなく、3つの文字列(と変数)、 「"UPDATE table SET A = '"」と、「B」と、「"' WHERE C=2"」をつなげているのです。 ちょうど、「'" & 」と「 & "'」で囲んでいるように見えるだけです。 AccessVBAでSQLを実行する場合の、SQL文は文字列を指定します。 全部で1つの文字列にして、初めてSQL文として使えます。 あと、B = 文字 はエラーになります。 B = "文字" としないといけません。 こんなこと言われなくても分かっているというなら、余計な意見でした。

cdma
質問者

お礼

ありがとうございました。 社内でわかる人も少なく 行き詰まっていたところです。 今後とも宜しくお願いします。 次回からも 例文と共に質問したいと考えます。

cdma
質問者

補足

回答ありがとうございます。 文字列変数以外に数値型の変数の場合 何か ルールはあるのでしょうか? 例えば、 Dim i As integer i=1 strSQL = "SELECT * FROM LINK WHERE 工番 i" です。

その他の回答 (4)

  • jaws
  • ベストアンサー率34% (30/87)
回答No.5

>文字列変数以外に数値型の変数の場合 >何か ルールはあるのでしょうか? > >例えば、 >Dim i As integer >i=1 >strSQL = "SELECT * FROM LINK WHERE 工番 i" >です。 工番 i という記述の意味がわかりません。 もし 工番=i のことであれば SQLは dim strSQL as String dim i as Integer strSQL = "SELECT * FROM LINK WHERE 工番=" & "'" &i&"'" となります。 これで i はSQL上文字になります。

  • jaws
  • ベストアンサー率34% (30/87)
回答No.3

>ところで,変数は 使えるということですね? はい。 もちろん使えます。 >例えば >B=文字 >であれば 上の場合、Aに "文字"が入るということで? シングルコーテーションは変数の値が文字列ならという意味でした。 変数が数値ならシングルコーテーションは必要ありません。

cdma
質問者

お礼

ありがとうございました。 社内でわかる人も少なく 行き詰まっていたところです。 今後とも宜しくお願いします。

  • jaws
  • ベストアンサー率34% (30/87)
回答No.2

すみません。 (2)についてですが、 strSQL="UPDATE table SET A ='" & B & "' WHERE C=2 " でした。 Bの変数の値を シングルコーテーションで囲わなければなりません。

cdma
質問者

補足

早速のご回答 ありがとうございます。明日にでも会社で試します。 ところで,変数は 使えるということですね? 例えば B=文字 であれば 上の場合、Aに "文字"が入るということで? A=B と A ='" & B & "' とは どう違うのでしょうか? '"&で囲めば 変数を使用できるということでしょうか?

  • jaws
  • ベストアンサー率34% (30/87)
回答No.1

(2)についてですが、 strSQL="UPDATE table SET A =" & B & "WHERE C=2 " としてみてください。 変数がをSQLの文字列の中に組み込まなくするのです。

関連するQ&A

  • SQLでの変数の扱いについて

    VBを利用してのSQL文に変数を使いたいのですが記述方法が良くわかりません。 まず dim a as string dim b as integer dim c as integer a="AAAA" b=10 c=23500 として テーブルZの項目1が nvarchar 項目2が tinyint 項目3がrealであった場合 sql文の記述方法をWebで探していると 文字列変数ならシングルクォーテーションでくくって代入 数値変数ならダイレクトに代入というようにとれるところがあったので下記の 様に記述すると更新されません sqlstr=("UPDATE テーブルZ set 項目1='a',項目2=b,項目3=c where 項目=1") 下記のように分割してそれぞれひとつづつのテストすると更新できます sqlstr=("UPDATE テーブルZ set 項目1=" & a & " where 項目=1") sqlstr=("UPDATE テーブルZ set 項目2='" & b & "' where 項目=1") sqlstr=("UPDATE テーブルZ set 項目2='" & c & "' where 項目=1") 上記の要領で1つにまとめると出来ないので,どのように書けばよいのでしょうか よろしくお願い致します

  • SQLの文章 羅列について

    SQLの文章を変更しようとしています。 更新対象の項目が増えてくるので1行の文章を分けたいのですが strSQL3 = "UPDATE LINK SET A ='" & a & "',B ='" & b & "' WHERE 工番=" & CStr(j) & ";" の1行の文章を 下記の通りしたのですが できませんでした。何故でしょうか? strSQL3 = "UPDATE TPK_LINK SET" strSQL3 = strSQL3 & "A ='" & a & "'" strSQL3 = strSQL3 & ",B ='" & b & "'" strSQL3 = strSQL3 & "WHERE 工番=" & CStr(j) & ";"

  • SQLの更新の時、記号 ’ について

    SQLの更新で不明な点があります。 strSQL = "UPDATE LINK SET 備考 ='" & B & "' WHERE 工番=" & CStr(j) & ";" LINK の備考1に 変数Bの値を更新したいのですが この時 Bの中に 'の記号が入っていれば"オブジェクトが無効"と出てきます。 例えば 24' (24インチを意味する) と表示したいのです。 'の記号を変換するしか ないのでしょうか? ※ 質問内容が足りなければ再度 詳しく質問したいと思います。

  • 1テーブル&複数レコードの更新に対して1度のupdate文での処理方法

    1テーブル&複数レコードの更新に対して1度のupdate文での処理方法 Delphi2010+SQL SERVER 2005で開発しています。 update文で、 現在下のようにwhileで複数レコードに対して、 1回、1回、sqlを発行して、更新しています。 これを、一度のSQLの発行で処理できないものでしょうか? 更新テーブルは1つで、更新する項目も同じです。 更新するデータと、where句の条件が異なります。 もし可能なようでしたら、どうかご教授お願いします。 update table set A=1,B=2 where id=1 update table set A=2,B=3 where id=5 update table set A=9,B=99 where id=7 update table set A=5,B=10 where id=15 update table set A=1,B=10 where id=75

  • SQLの同時実行

    SQL文について質問なんですが、下記のようなテーブルがあった場合に『2を3に、3を2にする』というクエリを作ってみましたが、どうもうまくいきません。 ┌─┬──┐ │No│項目│ ├-┼──┤ │1│ああ│ ├─┼──┤ │2│いい│ ├─┼──┤ │3│うう│ └─┴──┘ strSQL1=UPDATE テーブル名 SET No = '2' WHERE No = '3' strSQL2=UPDATE テーブル名 SET No = '3' WHERE No = '2' これをASPから実行する場合は cn.Execute(strSQL1) cn.Execute(strSQL2) とすると、先にstrSQL1が実行されテーブルが更新された後にstrSQL2が実行される ため、 ┌─┬──┐ │No│項目│ ├─┼──┤ │1│ああ│ ├─┼──┤ │3│いい│ ├─┼──┤ │3│うう│ └─┴──┘ となってしまいます。『2つの更新を同時に実行させる』もしくは『2つの更新クエリ1つにする』というようなことはできないものでしょうか?

  • SQL文の作成について

    前の質問が解決してないのに、すいません。 SQL文を作成して、関数に投げると配列で 実行結果が返ってくるらしいのですが。 SQL文作成時に変数をWHERE節に組み込む 記述の仕方が自信ないです。以下のような感じです。 Dim srtSql As String Dim Key_Id As String Call Key_Get(Key_Id)  ’キーを取得 strSql = strSql & ”Select Tb*” strSql = srtSql & ” From Tb ” strSql = strSql & ”Where ” srtSql = strSql & ”Tb_Key_Id = ’” strSql = strSql & Key_id & ”’” のように(Accessだとこんな感じ【キーはSring】)ダブルクォーテーションの外に書いてよいのでしょうか?

  • SQL初心者です。

    【Table1】 Col1 Col2 Aa A Ab A Ba B Bb B Ca C Ca D 【Table2】(Data1は固定) Data1 Data2 Aa A Ab B→A Ba C→B Bb A→B Ca B→C Ca C ※Col1に重複がある場合、重複結果の1行目のレコードをData2に入れる (今回の場合CをData2に入れる) Data1は固定で、Table1を使ってData2を上記の様に修正するSQLが書けなくて困っています。 Col1が重複してない場合の修正するSQLを書いてみましたが(合っているかはわかりませんが...)、 重複する場合のSQLも追加して最終的に1つのSQLで、すべて修正できるようにしたいです。 update Table2 T2  set Data2=  (select Col2 from Table1  where Col1=   (select Col1 from Table1 T1   where T2.Data1=T1.Col1   group by T1.Col1   having count(T1.Col1)=1  ) ) わかりにくい部分もあると思いますが、ご教授お願いします。

  • 条件付きの複数の列の更新を1度にすることは可能?

    MySQLバージョン4.1.16を使っています。 aという列はaが0より大きいときだけ-1したくて でもbはいかなる条件のときでも0にしたい、という場合に それを1つのSQL文で実行することは可能なのでしょうか? 例えば、 query("UPDATE table SET a = a - '1' WHERE a > '0';"); query("UPDATE table SET b = '0';"); を1つのSQL文で実行したいのです。

    • ベストアンサー
    • MySQL
  • ダブルコーテーションやシングルコーテーション

    私の持っている参考書の中に、次のように、 変数をダブルコーテーション、シングルコーテーション、およびピリオドで囲んでいるSQL文があるのですが、 この場合、なぜ、ダブルコーテーション、またはシングルコーテーションのみでは駄目なのでしょうか? [参考書の記載] where カラム名>="'.変数.'" ※変数は日付が入ります。varchar型です。

    • ベストアンサー
    • MySQL
  • SQLの選択処理について

    SQLの選択処理が上手くいきません Dim j As Integer と宣言します。 j=1 とします。  strSQL = "SELECT * FROM LINK WHERE 工番 =j;" だと 上手くいきません。ちなみに  strSQL = "SELECT * FROM LINK WHERE 工番 =1;" だと上手くいきました。   昨日、更新処理時については教えて頂いたのですが 上記は何故上手くいかないのでしょうか?  変数が数字で設定しているから?

専門家に質問してみよう