1

[Informix][Informix ODBC Driver][Informix]A syntax error has occurred以下のクエリを実行すると取得されます。二重のアポストロフィを削除すると、クエリが正常に実行されます。グーグルで見つけられるものはすべて、私が正しいことをしていることを示しています. 7 年前、私は Informix をこの種の問題なしで使用していたので、何か重要なことを忘れていたと思います!

insert into ct_repairs (ct_job_no,inh_job_no,reference,tab
,rec_date,rec_time,priority,start_dte,start_tme,app_date
,app_time,card_date,card_time,est_date_comp,est_time_comp
,act_date_comp,act_time_comp,exp_code,ct_notes,ct_status
) values (
2090
,335706
,'23026002003'
,'P'
,NULL
,''
,1
,"22/02/2010"
,'10:47'
,NULL
,''
,"22/02/2010"
,'11:14'
,NULL
,''
,NULL
,''
,'DTD'
,'**PLS NOTE PLANNED WRKS GOING ON ON ASCOT RD,IE ROOFS,RENDERERING,AND HIGH LEVEL CLOSE BOARD FENCES:SPOKE TO THE LADY AT NO 2 SHE DOESN''T NO ANYTHING ABOUT FENCE ISSUES,CALLED AT NO 4@6 ASCOT NO ACCESS TO EITHER PROPERTIES**:YOU YOU PLS SEND A EMAIL TO TREVOR ON PLANNED ASKING IF NO 2 ASCOT RD IS DOWN FOR A NEW CLOSED BOARDED FENCE,OR IS THAT THE PROBLEM NO 4 BEING PRIVATE THAT THEY  HAVEN''T PUT ONE UP**'
,0
)
4

1 に答える 1

1

使用している ODBC のバージョン、IDS (IBM Informix Dynamic Server) のバージョン、およびそれらが実行されているプラ​​ットフォームを特定していただけると助かります。

テーブルのないデータベースで、質問のコードをコピーして SQLCMD (DB-Access に相当) に貼り付けると、次のエラーが表示されます。

SQL -206: The specified table (ct_repairs) is not in the database.

これは、SQL が構文的に正しいことを示します。

では、なぜエラーが表示されるのでしょうか。

有罪の当事者の最初の疑いは、最後の長い (400 以上) 文字列です。かつて(少し前、AFAICR)、文字列リテラルの長さの上限は255でした。古いバージョンの ODBC ドライバー (または IDS) を使用している場合、これが原因である可能性があります。

2 番目に疑わしいのは、時折二重引用符で囲まれた日付文字列です。Informix は通常、文字列を一重引用符で囲むか二重引用符で囲むかについて緩いです。これは役に立ちます。ただし、文字列を一重引用符で囲み、「区切り識別子」にのみ二重引用符を使用することで、SQL 標準のように分かりやすくする方法があります。DELIMIDENT 環境変数が設定されている場合 (おそらく Windows では SETNET32 を介して)、strict モードが呼び出され、SQLCMD でそれを行うと、次のようになります。

SQL -201: A syntax error has occurred.

3 番目の疑いは、長い列が BYTE または TEXT (または BLOB または CLOB) 型であり、文字列リテラルからその型への変換がないことです。ただし、知る限り、ODBC ドライバーはその問題に対処するためにフープを介してジャンプし、エラーはおそらく次のように異なります。

SQL -617: A blob data type must be supplied within this context.

したがって、現時点では、DELIMIDENT を追跡する価値があると思います。おそらく、簡単に修正できます (日付を単一引用符で囲むか、DELIMIDENT の設定を解除することにより)。それができない場合は、短い文字列を試して、それが機能するかどうかを確認してください。

しかし、あなたの基本的な理解は正しいです。二重引用符を正しく使用しています。

于 2010-02-22T14:56:45.830 に答える