文字連結に問題がある?SQLの実行結果が不正な値になる原因とは?

このQ&Aのポイント
  • SQLの文字連結がうまくいかず、意図しない結果が生じています。
  • 変数の値を連結する際に、適切なデータ型の変換が行われないため、不正な値が生成されます。
  • 文字列と数値の連結の場合、データ型の変換が必要です。データ型の変換を行うことで、正しい結果が得られます。
回答を見る
  • ベストアンサー

文字の連結がうまくいかない

CString SQL_st; CString SQL_and; CString SQL_end; CString SQL_update; SQL_st = "update mac3data set read_flg = 1 where (seq >= "; SQL_and = ") and (seq <= "; SQL_end = ")"; SQL_update = SQL_st + st_seq + SQL_and + en_seq + SQL_end; 上記のように連結して実行すると、SQL_update には、 update mac3data set read_flg = 1 where (seq >= 1.00 までしか入っていません。 SQL_and 以後の文字が連結できません。 どこに問題があるのでしょうか? st_seq には、1.00 en_seq には、89.00 が入っています。

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

ひとまず SQL_update = SQL_st; SQL_update += st_seq; SQL_update += SQL_and; SQL_update += en_seq; SQL_update += SQL_end; とするとどうなりますか? あとは SQL_update.Format("%s%s%s%s%s",SQL_st , st_seq , SQL_and , en_seq , SQL_end); とか

ichigo61
質問者

お礼

ありがとうございます。 += で連結したら、うまくいきました。 + 連結は使わないほうがいいみたいですね。

関連するQ&A

  • SQL、oracleにて文字列操作(連結、切りだし)のパフォーマンス向上法

    oracle7を使用しています。 #desc a num  char(8) code char(2) seq char(2) ・・・ #desc b bango char(12) ・・・ 上記場合で aのnum,code,seq を結合したものと bのbangoが 同じかどうかの検索を外部結合付きで行いたいとします。 where bango(+) = num || code || seq で動作は正常に行われるのですが、検索速度がかなり重くなってしまいます。 文字列連結(||)は重くなるというのを聞いたことがあるのでできれば (||)を使用したくないのです。 where substr(bango,0,8) (+) = num and substr(bango,9,2) (+) = code and substr(bango,11,2) (+) = seq とすると外部結合のところでおこられちゃいました。 文字列連結をつかわずに上記SQLの検索パフォーマンス向上法を どなたか教えていただけませんか?

  • 文字列を連結した後に1つの変数として定義したい

    OpDate1、OpDate2・・・というように変数にデータを割り当てていたとき、テーブル(tbl_Option)に先ほどのデータを変数として更新クエリとして処理を行いたいのですが、文字列の連結後を1つの変数とした場合の定義の仕方がわかりません。ご教授をお願いします。 OpDate1 = #10/10/2013# OpDate2 = #11/10/2013# OpDate3 = #12/10/2013# Set DBH = CurrentDb() sql = " SELECT tbl_Option.* FROM tbl_Option;" Set rs = DBH.OpenRecordset(sql) If rs.RecordCount <> 0 Then rs.MoveLast rs.MoveFirst For iintLoop = 1 To rs.RecordCount With rs Set DBH2 = CurrentDb() →→ sql2 = " UPDATE tbl_Option SET tbl_Option.試用期限 = #" & "OpDate" & iintLoop & "#" _ & " WHERE (((tbl_Option.処理番号)=" & iintLoop & "));" DBH2.Execute sql2 .MoveNext End With Next iintLoop End If

  • Debug Assertion failed

    VC++のSQL Server 2008 の処理中に、 Debug Assertion failed のエラーが発生します。 落ちている場所は、dbcore.cpp の中です。 デバッグトレースを見る限り、下記ソースの2回目のrs2.Open らしいところまで辿りましたが、 なぜ、2回目のrs2.Open で落ちるかの原因がわかりません。 CString strCon2="DSN=MAC3DB_DS;"; db2.OpenEx( _T( strCon2 ), CDatabase::noOdbcDialog ); CRecordset rs2( &db2 ); while(end_sw==0) { try{ rs2.Open( CRecordset::forwardOnly, _T("select * from mac3data where read_flg = 0 order by seq") ); while( !rs2.IsEOF() ) { for(int index = 0; index <= rs2.GetODBCFieldCount(); index++ ) { switch(index) { case 1 : rs2.GetFieldValue("seq", _T(str_seq));break; 中略 } 中略 rs2.MoveNext(); } }catch(...){} } }

  • SQL文の連結が、うまくいきません

    いつもお世話になっております。  現在、SQL文生成プログラムを作成しているのですが  エラーメッセージ 「Microsoft OLE DB Provider for SQL Server (0x80040E14)  '.' 付近に不適切な構文があります。」  表示されて、どうしても解決出来ません  ソースを記載しますのでアドバイス頂けないでしょうか?  デバッガーみたいな事をさせてしまい、本当に申し訳ありません  開発者自分一人(ほぼ初めて)で、どうにも進みませんでしたので  お願いいたします。  ※--ASPのデバッグに関して  もう一つお聞きしたいのですが (出来ればこちらの質問も答えてくださると幸いです)  皆さんは、ASPのデバッグをどの様に行っていますか?  VB6.0やVBAの場合は、ソースが不完全やエラーでも  「F8」を押して、ソースの途中まで稼働させて  「現在格納されている変数の中身」等を確認して 割とエラー解決もスムーズに出来ましたが、ASPではそれが出来ないため  難航しています(Line*** と エラーメッセージだけを頼りに)  皆さんはASPの場合、どの様にエラー解消されていますか?  (どうにかして、自分一人でも安定して成果をあげていきたいので)  我流でも結構ですので、是非アドバイスお願いします SQL生成ソース '--SQL生成  strSQL = "select * from STA040, STA500M7"  '--SQL作成(抽出場合分け)  if check = "Day" then   strSQL = strSQL + "where STA500M7.CODE040 = STA040.CODE"  '--期日空白処理   Blank_out J_days_st,N_days_st,M_days_st,J_days_ed,N_days_ed,M_days_ed  '--受注日BetWeen   if J_days_st <> "" and J_days_ed <> "" then    strSQL = strSQL + " and STA500M7.YYMMDD_1 BETWEEN " & J_days_st_sql & " and " & J_days_ed_sql & " "  '--受注日start○,End×   Elseif J_days_st <> "" and J_days_ed = "" then    strSQL = strSQL + " and STA500M7.YYMMDD_1 >= " & J_days_st_sql & " "  '--受注日start×,End○   Elseif J_days_st = "" and J_days_ed <> "" then    strSQL = strSQL + " and STA500M7.YYMMDD_1 <= " & J_days_st_sql & " "  '--受注日start×,End×   Elseif J_days_st = "" and J_days_ed = "" then   End if  '--納期BetWeen   If N_days_st <> "" and N_days_ed <> "" then    strSQL = strSQL + " and STA500M7.YYMMDD_3 BETWEEN " & N_days_st_sql & " and " & N_days_ed_sql & " "  '--受注日start○,End×   Elseif N_days_st <> "" and N_days_ed = "" then    strSQL = strSQL + " and STA500M7.YYMMDD_3 >= " & N_days_st_sql & " "  '--受注日start×,End○   Elseif N_days_st = "" and N_days_ed <> "" then    strSQL = strSQL + " and STA500M7.YYMMDD_3 <= " & N_days_st_sql & " "  '--受注日start×,End×   Elseif N_days_st = "" and N_days_ed = "" then   End if  '--見積日BetWeen   If M_days_st <> "" and M_days_ed <> "" then    strSQL = strSQL + " and STA500M7.YYMMDD_10 BETWEEN " & M_days_st_sql & " and " & M_days_ed_sql & " "  '--見積日start○,End×   Elseif M_days_st <> "" and M_days_ed = "" then    strSQL = strSQL + " and STA500M7.YYMMDD_10 >= " & M_days_st_sql & " "  '--納期start×,End○   Elseif M_days_st = "" and M_days_ed <> "" then    strSQL = strSQL + " and STA500M7.YYMMDD_10 <= " & M_days_st_sql & " "  '--納期start×,End×   Elseif M_days_st = "" and M_days_ed = "" then   End if 'strSQL = strSQL + "order by sta500m7.code ASC" 'strSQL = "select * from STA040,STA500M7 where STA500M7.CODE040 = STA040.CODE and STA500M7.YYMMDD_3 >= " & hiduke & " " 'strSQL = strSQL + " order by sta500m7.code DESC;"    End if    '↓ここがエラーだと表示されます(おそらくSQLが問題かと)    Set objRS = objCon.Execute(strSQL)'レコードセットのオープン  アドバイスお願いいたします

  • データセットを選択するダイアグラムが表示される

    db2.OpenEx( _T( strCon2 ), CDatabase::noOdbcDialog ); 上記のような設定にしているのに、データセットを選択するダイアグラムが表示されてしまいます。 ただし、表示されないケースもあります。 while文で、 rs2.Open( CRecordset::forwardOnly, _T("select * from mac3data where read_flg = 0 order by seq") ); を数回実行するために、一度目のrs2.Openで読み込んだデータがすべて処理し終えたら、 rs2.Close() を行い、次に、 db2.OpenEx( _T( strCon2 ), CDatabase::noOdbcDialog ); CRecordset rs2( &db2 ); を行ったときに、ダイアログが表示されます。 一度目の db2.OpenEx( _T( strCon2 ), CDatabase::noOdbcDialog ); のときはダイアログは表示されません。 2度目の処理のときに表示されたダイアグラムでデータセットを選択すれば、処理としては問題なくできるのですが、なぜ、2度目のときにダイアグラムが表示されるのでしょうか? CString strCon2="DSN=MAC3DB_DS;"; db2.OpenEx( _T( strCon2 ), CDatabase::noOdbcDialog );  ← 一回目はでない CRecordset rs2( &db2 ); while(end_sw==0) { try{ rs2.Open( CRecordset::forwardOnly, _T("select * from mac3data where read_flg = 0 order by seq") );   中略 while( !rs2.IsEOF() )   中略 rs2.MoveNext(); } db2.Close(); db2.OpenEx( _T( strCon2 ), CDatabase::noOdbcDialog ); ←2回目のときに表示される CRecordset rs2( &db2 ); }

  • ある条件のSELECT文の作成について

    以下のSQLの作成で悩んでいます。 【内容】 抽出元テーブルの中で、あるコードが同じデータは、 ある項目を全て同じ値にして取得したい。 (例) ■抽出元テーブル コード SEQ FLG  1    1   1  1    2    1    3    2    1   0  2    2  2    3  3    1   1 コードは同じ物が1つ又は複数あります。 コードが同じ物にはSEQで番号が連番されます。 FLGの項目がありますが、SEQ=1のデータしか設定されていません。 ■求めたい結果 コード SEQ FLG  1    1   1  1    2   1    1    3   1  2    1   0  2    2   0  2    3   0  3    1   1 全てのデータでFLGを求めて取得します。 取得の仕方はコードが同じでSEQ=1の値を取ります。 抽出元テーブルと結果のデータ件数は同じになります。 抽出元テーブルと結果の違いは、FLGに値が埋まっているかどうかの違いのみです。 このテーブルのFLGはUPDATEする事は出来ません。 別表なども利用しないで、 selectのSQL文だけで対応したいです。 どのような方法で対応できるでしょうか? オラクルのバージョンは10gです。 よろしくお願い致します。

  • 演算子を使わずに書く

    $sqlを「.=」を使わずに書きたいんですが、複雑でよく分かりません。 どなたか書いてもらえませんか? $sql ="update table set flg=0 where id in("; $flg=true; foreach($_POST["del"] as $val){ if($flg) {$flg=false;} else {$sql.=",";} $sql .="'".mysql_real_escape_string($val)."'"; } $sql .=")"; よろしくお願いします。

    • ベストアンサー
    • PHP
  • select されたレコードの操作

    以下のようなuser_idとuser_pwのtableがあります。 |id(ai)|user_id|user_pw|flg| |1|AAA|111|0| |2|BBB|222|0| select id from table where user_id = AAA をされると 1 を返し、 update table set flg = 1 where id = 1 かまたは update table set flg = 1 where user_id = AAA を発行したいと思っています。 ただ、sql 発行元から2個のsqlを出せない事情があり、DB側で対応しなければなりません。 トリガはselectでは使えませんよね?  最悪、query_logを監視しながらselectが来たら自分でupdateを発行するスクリプト しかないのかと考えています。 アドバイスお願いします。

  • Excelでやるようにフラグ立てしたい

    最終的には以下のような「FLG1」、「FLG2」というカラムを追加したいです。 先頭はカラム名で、Excel上だと  FLG1には =IF(MOD(A2,2)=0,1,0)  FLG2には =IF(A2>=20,"L",IF(A2>=10,"M","S")) という数式が入っています。 V1 FLG1 FLG2 12 1 M 5 0 S 29 0 L 30 1 L 15 0 M MySQLのデータベース上には、元々「tbl1」というテーブルに「V1」のカラムだけがある。 その「tbl1」に対して、新たに「FLG1」と「FLG2」というカラム(フラグ列)を追加したい。 というのが目的です。 現状だと(まだMySQL初心者のため)「V1」をそのままコピーし、UPDATEを使って、1つずつ条件判定して値を上書きしていく方法しかわかっていません。。。 例えばFLG2については以下のように(汗) UPDATE tbl1 SET FLG2='L' WHERE V1>=20 UPDATE tbl1 SET FLG2='M' WHERE V1>=10 AND V1<20 UPDATE tbl1 SET FLG2='L' WHERE V1>=0 AND V1<10 たぶんいくつかの方法があると思うのですが、基本的なものから難しい(ちょっとテクを必要とする)ものまで幅広く教えていただけるとありがたいです。そうすれば、それを今後勉強していけるので。

    • ベストアンサー
    • MySQL
  • UPDATEのCASE文で・・

    SQLの独学をはじめて間もない素人です。 今case文を使って・・a_flg、b_flgを更新というコードを考えたのですが・・↓ UPDATE tm_results_payment SET a_flg = ( CASE WHEN b_flg=1 AND a_flg=1 THEN '0' END ) b_flg = ( CASE WHEN b_flg=1 AND a_flg=1 THEN '1' ELSE b_flg END ) CASE文は同じ条件です。値を2個とも変更したいので上の処理を考えました。 しかし、どうやら先に最初のCASE文でa_flgを0に変えてしまっているので、 次のCASE文では処理をしてくれません・・; 同時進行で値を更新する方法ってどうすればよいのでしょうか・・; よろしくお願いいたします。

専門家に質問してみよう