2008-09-05 23 views
19

Estoy tratando de realizar una consulta SQL a través de un servidor SSAS vinculado. La consulta inicial funciona bien:Error de "nombre de columna no válido" en la declaración SQL de los resultados de OpenQuery

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

Pero si intento agregar:

WHERE "Value" > 0 

me sale un error

nombre de columna no válido 'Valor'

Cualquier ideas de lo que podría estar haciendo mal?


Así que el problema era que el orden en que se procesan los elementos de la consulta son diferentes que el orden en que están escritos. De acuerdo con esta fuente:

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

El orden de evaluación en MSSQL es:

  1. DE
  2. EN
  3. JOIN
  4. DONDE
  5. GROUP BY
  6. TENER
  7. SELECT
  8. ORDER BY

lo tanto, el alias no se procesó hasta después de la WHERE y HAVING.

+1

¿Qué pasa con todas las preguntas que no responden a esta pregunta? –

Respuesta

17

Esto debería funcionar:

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

No es que el valor es una palabra reservada, el problema es que es un alias de columna, no el nombre de la columna. Al convertirlo en una vista en línea, "Valor" se convierte en el nombre de la columna y luego puede usarse en una cláusula where.

0

Oh, bummer. Acabo de ver, seleccionas AS FOO. ¿No necesitas un HAVING claus en este caso?

SELECT whatever AS value FROM table HAVING value > 1; 

Todavía no utilizaría "value". ¡Pero para estar seguro, búscalo en tus documentos!

6

Está utilizando "Valor" como alias de una columna, y no creo que el alias pueda aparecer en la cláusula where. Simplemente se usa para nombrar el valor de columna devuelto. Su cláusula Where debe hacer referencia al nombre de columna original:

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

Puedo responder por dejarlo fuera de GROUP BY. La buena noticia es que funciona perfectamente como un simple alias seleccionado antiguo.

Cuestiones relacionadas