2008-09-05 16 views
19

リンクされたSSASサーバーを介してSQLクエリを実行しようとしています。私が追加しようとOpenQueryの結果からSQLステートメントに "無効な列名"エラーが発生しました

SELECT "Ugly OLAP name" as "Value" 
FROM OpenQuery(OLAP, 'OLAP Query') 

:しかし、最初のクエリが正常に動作します

WHERE "Value" > 0 

私は '値'

どれエラー

無効な列名を取得します私が間違っているかもしれないアイデア?


問題は、クエリの要素が処理される順番が、書き込まれる順序と異なることです。このソースによれば:

http://blogs.x2line.com/al/archive/2007/06/30/3187.aspx

MSSQLにおける評価の順序は、

  1. FROM
  2. ON HAVING
  3. BY
  4. グループに参加します
  5. だから、別名はWHEREとHAVING句の後まで処理されませんでした

BY

  • 順序を選択。

  • +1

    この質問に関するすべての非回答はどうですか? –

    答えて

    17

    これは動作するはずです:

    SELECT A.Value 
    FROM (
    SELECT "Ugly OLAP name" as "Value" 
    FROM OpenQuery(OLAP, 'OLAP Query') 
    ) AS a 
    WHERE a.Value > 0 
    

    それは価値が予約語であることはありませんが、問題は、それが列の別名ではなく、列名であるということです。インライン・ビューにすることで、「Value」が列名になり、where句で使用できます。

    0

    ああ、バマー。私はちょうどあなたがAS FOOを選択したのを見た。この場合、HAVINGのクラウスは必要ありませんか?

    SELECT whatever AS value FROM table HAVING value > 1; 
    

    私はまだ「値」を使用しません。しかし確かに、あなたのドキュメントでそれを見てください!

    6

    "Value"を列エイリアスとして使用していて、エイリアスがwhere句に表示されないと思います。これは単に返された列の名前を指定するために使用されます。 where句で元の列名を参照する必要があります。

    SELECT "Ugly OLAP name" as "Value" 
    FROM OpenQuery(OLAP, 'OLAP Query') 
    WHERE "Ugly OLAP name" > 0 
    
    0

    GROUP BYから除外することを保証することができます。良いニュースは、それは普通の選択されたエイリアスです。

    関連する問題