2011-12-23 10 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 

Kiedy próbuję wykonać następujące otrzymuję błąd:Nie można użyć tymczasowej kolumny w klauzuli where?

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

prostu zastanawiasz się, w jaki sposób można odwołać tę kolumnę tymczasowy? Szukałem wcześniejszych postów, które sugerowały używanie "posiadania" tego, ale to też nie działa.

Odpowiedz

9

Jednym rozwiązaniem byłoby, aby podselekcji całego rachunku, przy zastosowaniu klauzuli WHERE na jej wynik

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 

Innym rozwiązaniem mogłoby być powtórzyć cały klauzuli 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 

Albo można przetestować każdy indywidualny pole dla 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' da problemy OP. Zdaje mi się, że nie jest to zamierzona klauzula warunkowa. –

+1

@Shark - Dziękuję, tęskniłem za tym. Błąd jest ustalony na –

+3

+1, ponieważ opcja 3 jest bardziej praktycznym refaktorem opcji 2 i często jest bardziej użyteczną klauzulą ​​dla optymalizatora niż opcja 1. * [Może czuć się mniej elegancko, ale kiedy daje optymalizatorowi więcej wskazówek, aby zmniejszyć plan wykonania, ma nogi, a ja lubię nogi.] * – MatBailie

5

Byłbyś albo trzeba użyć Express w klauzuli WHERE lub użyj zapytanie SELECT jako podzapytania, tak:

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 

Lub sloppier (moim zdaniem) trasa będzie:

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 

Zawsze korzystam z pierwszego rozwiązania.

zauważyć również, że zmieniłeś klauzuli WHERE z

RowID <> NULL 

Aby

RowID is not NULL 

To dlatego <> NULL nigdy oceni true. Testy SQL Server dla NULL (tj. Nieznane) przy użyciu IS i IS NOT.

+0

+1 z klauzuli porównania. –

+1

+1 Lub użyj CTE zamiast pod-zapytania. Oni są pretttttttty! – MatBailie

+0

@Dems - oh proszę ... idź do łóżka ...;) –

Powiązane problemy