2009-09-02 20 views
7

アプリケーションには、両方ともShowOrderの列を持つ2つのテーブルがあります。アプリケーションでHibernateを使用しており、HQLを使用して、最初のテーブルと2番目のテーブルのそれぞれShowOrderで注文された2つのテーブルを結合します。OrderByでエイリアスは無視されます

はここに私のクエリの簡易版です。一般的には

SELECT pr.Id as Id,pr.Title as Title, pr.ShowOrder as ShowOrder 
FROM Process pr 
    INNER JOIN ProcessGroup prg ON pr.GroupId=prg.Id 
ORDER BY prg.ShowOrder,pr.ShowOrder 

、我々のアプリケーションは、何の問題もなく働いています。しかし、私たちには、古いアプリケーションと、そのデータベースを新しいアプリケーションデータベースに変換する変換ルーチンがあります。

古いデータベースを新しいデータベースに変換するときは、SQLサーバーが上記のクエリを実行するときにエラーが発生します。例外は言う:私たちはすべてがOKです別名なしpr.ShowOrderを選択した場合

列がリスト

順に複数回指定されています。

選択リスト内ShowOrder別名がある場合、SQL Serverはテーブルのエイリアスを無視し、pr.ShowOrderprg.ShowOrderが同じであることを前提としているようです。

答えて

12

間の行動の変化です。

ORDER BYは、ソース表(FROM句)の列値を操作するのではなく、出力 SELECT句(**)の列値でのみ動作します。したがって、ORDER BY句に "ShowOrder"と言うと、実際には出力リストのShowOrder値を使用しています(pr.ShowOrderになります)。両方のShowOrdersを使用する場合は、両方を異なる名前のSELECT句に入れる必要があります。

ソーステーブルエイリアス名(技術的には必須)は、SQL Server 2000との互換性を保つためのものですが、危険な互換性があります。 ORDER BYで使用するエイリアス名に関係なく、実際には出力リストに表示されているエイリアス名のみを使用します。

(** - それはまわりにありますが、ほとんどの場合、以前のバージョンと互換性があります。

2

このエラーのもう1つの理由は、データベースの互換性レベルが "2000-mode"(SQL Serverを2000年から2005年にアップグレードした後に発生する可能性があります)です。

ソリューション:

"SQL Management Studioの" - "プロパティ" - - "オプション" - "互換性レベル" - 90以上に設定されたデータベースを右クリックします。

+0

私は実際に同じことをしました – Beatles1692

関連する問題