0

生产 IBM WebSphere 集成总线的 ESQL 计算节点包含以下 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;

DateFrom并且DateTo在 XSD 中被描述为xsd:dateTime,因此被视为TIMESTAMP
集成总线产生以下查询:

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 Wire Protocol driver][Microsoft SQL Server]
'2016-09-29 00:00:00' 附近的语法不正确

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

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

异常详情

目录 = 'BIPmsgs'
编号 = 2322
文本 = 子 SQL 异常
文件 = '/build/S1000_slot1/S1000_P/src/DataFlowEngine/MessageServices/ImbOdbc.cpp'
行 = 3776
函数 = 'ImbOdbcStatement::checkRcInner'

SQL 状态 = HY000本
机错误代码 = 102
错误文本 = [IBM][ODBC SQL Server 有线协议驱动程序][Microsoft SQL Server]“2016-09-29 00:00:00”附近的语法不正确。

4

1 回答 1

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;

它产生一个正确的查询,但没有解决问题,也没有解释为什么它在测试中有效,但在生产中无效。
问题是开放的。

于 2016-09-29T06:32:30.587 回答