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

Когда я пытаюсь выполнить следующее я получаю сообщение об ошибке:Нельзя использовать временную колонку в разделе where?

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

Просто интересно, как я могу ссылаться на эту временную колонку? Я искал предыдущие публикации, которые предполагали использовать «наличие» для этого, но это тоже не работает.

ответ

9

Одно решение было бы сделать подвыбор всего заявления, применяя где пункт о его результате

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 

Другим решением может быть повторить весь пункт в ИНЕКЕ

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 

Или вы могли бы проверить каждое отдельное поле 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' даст проблемы с OP. Я полагаю, это не предполагаемая условная оговорка. –

+1

@Shark - Спасибо, я пропустил это. Ошибка исправлена ​​ –

+3

+1, поскольку Option3 является более практичным рефактором Option2 и часто является более полезным предложением для оптимизатора, чем Option1. * [Это может показаться менее изящным, но когда он дает оптимизатору больше подсказок, чтобы уменьшить план выполнения, у него есть ноги, и мне нравятся ноги.] * – MatBailie

5

Вы бы должны либо использовать экспресс в предложении WHERE или использовать SELECT запрос как подзапрос, например, так:

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 

Или sloppier (на мой взгляд) маршрут будет:

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 

Я бы выбрал первое решение каждый раз.

заметить также, что я изменил свой пункт WHERE от

RowID <> NULL 

Для

RowID is not NULL 

Это происходит потому, что <> NULL никогда не будет вычисляться так. SQL Server для NULL (т. Е. Неизвестно) с использованием IS и IS NOT.

+0

+1 в статье сравнения. –

+1

+1 Или используйте CTE вместо подзапроса. Они преданные! – MatBailie

+0

@ Dems - о, пожалуйста ... ложитесь спать ...;) –

Смежные вопросы