2008-09-05 7 views
19

J'essaie d'effectuer une requête SQL via un serveur SSAS lié. La requête initiale fonctionne très bien:Erreur "nom de colonne non valide" sur l'instruction SQL à partir des résultats OpenQuery

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

Mais si j'essaie d'ajouter:

WHERE "Value" > 0 

je reçois une erreur

nom de colonne non valide 'Valeur' ​​

Tous idées ce que je pourrais faire mal? Donc, le problème était que l'ordre dans lequel les éléments de la requête sont traités est différent de l'ordre dans lequel ils sont écrits. Selon cette source:

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

L'ordre d'évaluation dans MSSQL est:

  1. DE
  2. SUR
  3. REJOIGNEZ
  4. GROUP BY
  5. PRESENTANT
  6. SELECT
  7. ORDER BY

Ainsi, l'alias n'a pas été traitée qu'après les clauses WHERE et HAVING.

+1

Qu'est-ce qui ne répond pas à cette question? –

Répondre

17

Cela devrait fonctionner:

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

Ce n'est pas que la valeur est un mot réservé, le problème est que c'est un alias de colonne, pas le nom de la colonne. En en faisant une vue en ligne, "Value" devient le nom de la colonne et peut ensuite être utilisé dans une clause where.

0

Oh, dommage. Je viens de voir, vous sélectionnez AS FOO. N'avez-vous pas besoin d'un clan HAVING dans ce cas?

SELECT whatever AS value FROM table HAVING value > 1; 

Je n'utiliserais toujours pas de "valeur". Mais pour être sûr, cherchez dans vos documents!

6

Vous utilisez "Value" comme un alias de colonne, et je ne pense pas que l'alias peut apparaître dans la clause where. Il est simplement utilisé pour nommer la valeur de colonne renvoyée. Votre clause where doit se référer au nom de la colonne d'origine:

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

Je peux se porter garant pour le laisser sur GROUP BY. Les bonnes nouvelles sont, cela fonctionne très bien étant un alias sélectionné vieux plaine.

Questions connexes