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およびDateToXSD では として記述される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 ワイヤ プロトコル ドライバー][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 Wire Protocol driver][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 に答える