2011-12-23 26 views
5
select cast(de.ApprovalOrder AS VARCHAR(32)) 
      + cast(de.EntityCode AS VARCHAR(32)) 
      + isnull(cast(de.DelegationCode AS VARCHAR(32)), '') as 'RowID' , 
      * 
from workflow.delegation_engine de 
where RowID <> NULL 

Cuando trato de ejecutar el siguiente recibo el error:No se puede usar la columna temporal en where cláusula?

Msg 207, Level 16, State 1, Line 13 Invalid column name 'RowID'.

Sólo me preguntaba cómo puedo hacer referencia a esta columna temporal? Busqué publicaciones anteriores que sugirieron usar 'tener' para esto, sin embargo, eso tampoco parece funcionar.

Respuesta

9

Una solución sería hacer una subselección de toda la declaración, la aplicación de la cláusula where en su resultado

select * 
from (
      select cast(de.ApprovalOrder AS VARCHAR(32)) 
        + cast(de.EntityCode AS VARCHAR(32)) 
        + isnull(cast(de.DelegationCode AS VARCHAR(32)), '') as 'RowID' 
        , * 
      from workflow.delegation_engine de 
     ) de 
where de.RowID IS NOT NULL 

Otra solución podría ser repetir todo la cláusula en la cláusula WHERE

select cast(de.ApprovalOrder AS VARCHAR(32)) 
     + cast(de.EntityCode AS VARCHAR(32)) 
     + isnull(cast(de.DelegationCode AS VARCHAR(32)), '') as 'RowID' , 
     * 
from workflow.delegation_engine de 
where cast(de.ApprovalOrder AS VARCHAR(32)) 
     + cast(de.EntityCode AS VARCHAR(32)) 
     + isnull(cast(de.DelegationCode AS VARCHAR(32)), '') IS NOT NULL 

O usted podría probar cada campo individual para NULL

select cast(de.ApprovalOrder AS VARCHAR(32)) 
     + cast(de.EntityCode AS VARCHAR(32)) 
     + isnull(cast(de.DelegationCode AS VARCHAR(32)), '') as 'RowID' , 
     * 
from workflow.delegation_engine de 
where de.ApprovalOrder IS NOT NULL 
     AND de.EntityCode IS NOT NULL 
+1

'<> NULL' dará los problemas de OP. No es la cláusula condicional prevista, creo. –

+1

@Shark - Gracias, me he perdido esa. El error es –

+3

+1 fijo, ya que Option3 es un refactor más práctico de Option2, y a menudo una cláusula más útil para el optimizador que Option1. * [Puede parecer menos elegante, pero cuando da al optimizador más pistas para reducir el plan de ejecución, tiene piernas y me gustan las piernas.] * – MatBailie

5

Se podría o bien tienen que utilizar el expreso en la cláusula WHERE, o usar su consulta SELECT como una sub consulta, así:

select * 
from 
(
    select cast(de.ApprovalOrder AS VARCHAR(32)) 
       + cast(de.EntityCode AS VARCHAR(32)) 
       + isnull(cast(de.DelegationCode AS VARCHAR(32)), '') as RowID, 
       * 
    from workflow.delegation_engine de 
) 
where RowID is not NULL 

O bien, el (en mi opinión) sloppier ruta sería:

select cast(de.ApprovalOrder AS VARCHAR(32))  
      + cast(de.EntityCode AS VARCHAR(32))  
      + isnull(cast(de.DelegationCode AS VARCHAR(32)), '') as RowID, 
      * 
from workflow.delegation_engine de 
where cast(de.ApprovalOrder AS VARCHAR(32))  
      + cast(de.EntityCode AS VARCHAR(32))  
      + isnull(cast(de.DelegationCode AS VARCHAR(32)), '') is not null 

Me gustaría ir con la primera solución cada vez.

Observe también que he cambiado su cláusula de WHERE

RowID <> NULL 

Para

RowID is not NULL 

Esto se debe a <> NULL Nunca se evaluará como true. SQL Server prueba para NULL (es decir, desconocido) utilizando IS y IS NOT.

+0

+1 en la cláusula de comparación. –

+1

+1 O use un CTE en lugar de una subconsulta. ¡Son pretttttttty! – MatBailie

+0

@Dems - oh por favor ... ir a la cama ...;) –

Cuestiones relacionadas