ESQL在时间戳附近生成错误的语法

时间:2016-09-29 04:47:19

标签: sql-server exception odbc ibm-integration-bus extended-sql

生产的ESQL计算节点IBM WebSphere集成总线包含以下ESQL查询:

SET result[] =
  SELECT p.Id, p.Date, p.Value
  FROM   DatabaseName.dbo.TableName AS p
  WHERE  p.Date >= InputRoot.XMLNSC.ns:RequestType.Request.DateFrom
  AND    p.Date <= InputRoot.XMLNSC.ns:RequestType.Request.DateTo;

DateFromDateTo在XSD中描述为xsd:dateTime,因此被视为TIMESTAMP
Integration bus产生以下查询:

SELECT p.Id, p.Date, p.Value 
FROM DatabaseName.dbo.TableName as p 
WHERE p.Date < TIMESTAMP'2016-01-02 00:00:00' and p.Date >= TIMESTAMP'2016-01-01'

哪个不正确并导致异常

  

[IBM] [ODBC SQL Server有线协议驱动程序] [Microsoft SQL Server]
  2016-09-29 00:00:00&#39;

附近的语法不正确

更奇怪的是,测试IBM WebSphere运行良好并且不会产生这种奇怪的#TIM; TIMESTAMP&#34;前缀,而生产集成总线是测试集成总线虚拟机的完整克隆。

测试和生产远程数据库的SQL Server版本及其兼容级别相同(SQL Server 2008 R2; 80)。

例外详情

  

目录=&#39; BIPmsgs&#39;
  数字= 2322
  Text =子SQL异常
  File =&#39; /build/S1000_slot1/S1000_P/src/DataFlowEngine/MessageServices/ImbOdbc.cpp'
  线= 3776
  函数=&#39; ImbOdbcStatement :: checkRcInner&#39;

     

SQL State = HY000
  本机错误代码= 102
  错误文本= [IBM] [ODBC SQL Server有线协议驱动程序] [Microsoft SQL Server]在2016-09-29 00:00:00&#39;附近语法不正确。

1 个答案:

答案 0 :(得分:0)

我使用了明显的解决方法 - 我自己将TIMESTAMP转换为字符串,并将字符串传递给ESQL:

SET OutputLocalEnvironment.DateFromString = 
   CAST(requestNode.DateFrom AS CHARACTER FORMAT 'yyyy-MM-dd HH:mm:ss.SSS');
SET OutputLocalEnvironment.DateToString = 
   CAST(requestNode.DateTo AS CHARACTER FORMAT 'yyyy-MM-dd HH:mm:ss.SSS');

SET result[] =
  SELECT p.Id, p.Date, p.Value
  FROM   DatabaseName.dbo.TableName AS p
  WHERE  p.Date >= OutputLocalEnvironment.DateFromString
  AND    p.Date <= OutputLocalEnvironment.DateToString;

它产生了正确的查询,但没有解决问题,也没有解释为什么它在测试中起作用,但不在生产上。
问题是公开的。