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;
Он производит правильный запрос, но не решает проблему и не объясняет, почему он работает в тесте, но не в производстве.
Вопрос открыт.