ESQL выдает неправильный синтаксис возле отметки времени

Вычислительный узел 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;

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][Microsoft SQL Server]
Неверный синтаксис около '2016-09-29 00:00:00'

Что еще более странно, тестовый IBM WebSphere работает хорошо и не генерирует этот странный префикс "TIMESTAMP", в то время как шина производственной интеграции является полным клоном виртуальной машины тестовой шины интеграции.

Версии SQL Server для тестовой и рабочей удаленной базы данных и уровни ее совместимости одинаковы (SQL Server 2008 R2; 80).

Детали исключения:

Catalogue = 'BIPmsgs'
Номер = 2322
Текст = дочернее SQL-исключение
File = '/build/S1000_slot1/S1000_P/src/DataFlowEngine/MessageServices/ImbOdbc.cpp'
Линия = 3776
Function = 'ImbOdbcStatement:: checkRcInner'

Состояние SQL = HY000
Собственный код ошибки = 102
Текст ошибки = [IBM][Драйвер ODBC SQL Server Wire Protocol][Microsoft SQL Server] Неверный синтаксис около '2016-09-29 00:00:00'.

1 ответ

Я использовал очевидный обходной путь - я сам преобразовал 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;

Он производит правильный запрос, но не решает проблему и не объясняет, почему он работает в тесте, но не в производстве.
Вопрос открыт.

Другие вопросы по тегам