1

[Informix][Informix ODBC Driver][Informix]A syntax error has occurred在运行下面的查询时得到。当我删除双撇号时,查询成功执行。我在谷歌上搜索到的所有内容都告诉我我在做正确的事情。七年前我使用 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 动态服务器)的版本以及它们运行的​​平台,将会很有帮助。

当我将问题中的代码复制到没有表的数据库中的 SQLCMD(相当于 DB-Access)中时,出现错误:

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

这表明该 SQL 在语法上是正确的。

那么,为什么您会看到错误?

我对有罪方的第一个嫌疑人是最后的长(400+)字符串。曾经(不久前,AFAICR)字符串文字的长度上限为 255。如果您使用的是足够旧版本的 ODBC 驱动程序(或 IDS),这可能是一个因素。

我的第二个嫌疑人是偶尔出现的双引号日期字符串。Informix 通常对您在字符串周围使用单引号还是双引号表示松懈。这可能会有所帮助。但是,有一种方法可以使它像 SQL 标准一样迂腐,要求在字符串周围加上单引号,并且仅对“分隔标识符”使用双引号。如果设置了 DELIMIDENT 环境变量(可能通过 Windows 上的 SETNET32),将调用严格模式,当我在 SQLCMD 中执行此操作时,我得到:

SQL -201: A syntax error has occurred.

第三个怀疑是长列是 BYTE 或 TEXT(或者可能是 BLOB 或 CLOB)类型,并且没有从字符串文字到该类型的转换。但是,AFAIK,ODBC 驱动程序跳过箍来处理该问题,并且错误会有所不同,可能类似于:

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

所以,目前,我认为 DELIMIDENT 非常值得一试——它可能很容易修复(通过确保日期用单引号括起来或取消设置 DELIMIDENT)。如果做不到这一点,请尝试使用较短的字符串,看看是否有效。

但是你的基本理解是正确的——你正确地使用了双引号。

于 2010-02-22T14:56:45.830 回答