7

アプリケーションには 2 つのテーブルがあり、どちらにもShowOrder列があります。アプリケーションで NHibernate を使用し、HQL を使用して、これら 2 つのテーブルShowOrderをそれぞれ最初のテーブルと 2 番目のテーブルで並べ替えます。

これが私のクエリの簡略版です。

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 サーバーが上記のクエリを実行しようとするとエラーが発生します。例外は言う:

order by リストで 1 つの列が複数回指定されています

pr.ShowOrderエイリアスなしで選択すると、すべて問題ありません。

選択リストにエイリアスがある場合ShowOrder、SQL Server はテーブル エイリアスを無視し、pr.ShowOrderprg.ShowOrderが同じであると想定しているようです。

4

3 に答える 3

12

これは ANSI SQL の標準的な動作であり、2005 バージョン以降の SQL Server で採用されました。

ORDER BY は、ソース テーブル (FROM 句) の列の値には作用しません。技術的には、SELECT 句 (**)の出力列の値にのみ作用します。したがって、ORDER BY 句で「ShowOrder」と言うと、実際には出力リスト (たまたま pr.ShowOrder) で ShowOrder 値を使用しています。両方の ShowOrder を使用する場合は、両方を異なる名前で SELECT 句に入れる必要があります。

ソーステーブルのエイリアス名を使用するときに吠えない理由(技術的にはそうあるべき) は、SQL Server 2000 との互換性のためですが、これは危険な互換性です。ORDER BY で使用するエイリアス名に関係なく、実際には出力リストに表示されるものだけを使用しています。

(** - はい、それを回避する方法はありますが、ほとんどの場合、以前のバージョンとの互換性を提供するために存在します。標準をそのまま使用する方がよいでしょう)。

于 2009-09-02T11:37:49.207 に答える
10

これは、SQL Server 2000 と SQL Server 2005 の間の動作の変更です。

http://social.msdn.microsoft.com/Forums/en-US/transactsql/thread/198b29db-f223-4aaf-a9f2-965c8a1fa8eb

于 2009-09-02T11:37:36.960 に答える
2

このエラーの別の理由として、データベースの互換性レベルが " 2000-mode " に設定されていることが考えられます (これは、SQL Server を 2000 から 2005 以降にアップグレードした後に発生する可能性があります)。

解決:

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

于 2011-02-04T09:53:21.207 に答える