2016-06-28 5 views
1

ODBCを使用して次のクエリを実行しているとき、私は進行中のデータベースからこのエラーを取得する:ODBCエラー

SELECT distinct Table.column, 
     { fn CONVERT(SUBSTRING(Table.ProblematicColumn, 1, 60), SQL_VARCHAR)} as test 
FROM PUB.Table 
WHERE (Table.id IN (
      SELECT Table.id 
      FROM PUB.Table 
      )) 

私はそれを使用してそれを修正することが可能です知っていますDBTools。ただし、複数のクライアントの複数のProgressデータベースに対してクエリを実行するため、毎回これを行うのは現実的ではありません。 また、何らかの理由で、私が使用しているODBCクライアント(PHP)は、このようなときにエラーを表示しません。代わりに、空の結果を返します。

サブクエリを追加するまでは、VAR_CHARを60文字に変換していました。サブクエリがそこにあるとき、私は再び同じエラーを得る。

興味深いことに、 'distinct'がそこにないとき、それは働いています。しかし、私は別個のものが必要です。

編集:問題は、DBToolで幅の列を固定せずにこのクエリを実行する方法です。

+0

あなたは問題が何であり、どのように修正するかを知っています。しかし、あなたはそれを修正したくありません。あなたの質問は何ですか? –

+0

質問は簡単です - クエリを実行してこのエラーを回避する方法。前述のように、 '{fn CONVERT}'を使用すると、メインクエリに役立ちました。サブクエリが関わっているときにどのように修正できるか – David

+0

その質問に対する回答は簡単でよく知られています。 –

答えて

0

OE 11.6にアップグレードしてください。

11.6には、自動的にサイレントにデータを切り捨ててエラーが発生しないようにするオプションがあります。

"自律スキーマの更新"

https://community.progress.com/community_groups/openedge_rdbms/f/18/t/19534

+0

ありがとうございます。残念ながら、すべてのクライアントのデータベースをアップグレードすることは可能ではありません。また、彼らのデータが静かに切り捨てられるというアイデアが気に入らないかどうかはわかりません。 私は、ユーザーにデータを列幅以上に挿入させ、データをクエリしてエラーを表示させるという考えが何であるか疑問に思っています。元の幅よりもデータを追加するために必要な柔軟性は理解できますが、幅を変更することも期待しています(no-sqlと同様)。 – David

+0

オンザフライでの幅の変更もオプションです。 –

+0

記述方法と同じように動作させたい場合は、dbtoolまたはupgradeを実行するか、フィールド幅がそれほど大きくないSQLクライアントを見つける必要があります。 –

1

それは答えを見つけるために数分かかりました。この問題は、OE10 SQLブローカがwhere句のsub selectを処理していないように見えます。サブ選択に内部結合を使用するこの代替方法は、私と同等に見えます。私はそれをテストした、それは動作します。 SQLクライアントを置き換えることは何もせず、OpenEdge SQLブローカーでエラーが発生します。OpenEdge JDBCドライバーを使用して同じエラーが発生します。

SELECT distinct Table.column, 
    { fn CONVERT(SUBSTRING(Table.ProblematicColumn, 1, 60), SQL_VARCHAR)} as test 
FROM PUB.Table inner join (select id from PUB.Table) t2 on Table.id = t2.id 
+0

ありがとうジョン。残念ながら、私の具体的なケースはより複雑です。ここで言及した例は、実際のクエリの非常に単純化されたバージョンです。私はあなたのアプローチを試み、WHERE句のサブクエリ部分が 'OR'ではないので、WHERE句からJOINへのサブクエリをINNER JOINからLEFT JOINに変更しました。それでも、結果セットは展開されません。これは、WHERE節が結果セットを絞り込むためです。 とにかく、あなたの答えは100%であり、サブクエリをJOIN句に移動するとエラーメッセージが解決されます。 – David