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

Khi tôi cố gắng thực hiện những điều sau đây tôi nhận được lỗi:Không thể sử dụng cột tạm thời trong mệnh đề where?

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

Chỉ cần tự hỏi làm thế nào tôi có thể tham khảo cột tạm thời này? Tôi đã tìm kiếm các bài đăng trước đó đề xuất sử dụng 'có' cho điều này tuy nhiên điều đó dường như không hoạt động.

Trả lời

9

Một giải pháp sẽ được thực hiện một subselect của toàn bộ tuyên bố, áp dụng mệnh đề where trên kết quả của nó

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 

Một giải pháp khác có thể lặp lại toàn bộ điều khoản trong mệnh đề WHERE

sự
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 

Hoặc bạn có thể kiểm tra từng trường riêng lẻ cho 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' sẽ cung cấp cho các vấn đề OP. Nó không phải là mệnh đề có điều kiện dự định, tôi tin. –

+1

@Shark - Cảm ơn bạn, tôi đã bỏ lỡ điều đó. Lỗi được cố định –

+3

+1 như Option3 là một trình tái cấu trúc thực tế hơn của Option2 và thường là một mệnh đề hữu ích hơn cho trình tối ưu hóa hơn Option1. * [Nó có thể cảm thấy ít thanh lịch hơn, nhưng khi nó mang lại cho người tối ưu nhiều manh mối hơn để giảm kế hoạch thực hiện, nó có chân, và tôi thích chân.] * – MatBailie

5

Bạn muốn hoặc phải sử dụng nhanh trong mệnh đề WHERE, hoặc sử dụng truy vấn SELECT của bạn như một subquery, như vậy:

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 

Hoặc, (theo ý kiến ​​của tôi) tuyến đường sloppier sẽ là:

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 

Tôi sẽ đi với giải pháp đầu tiên mỗi lần.

Cũng cần chú ý rằng tôi đã thay đổi khoản WHERE của bạn từ

RowID <> NULL 

Để

RowID is not NULL 

Điều này là do <> NULL sẽ không bao giờ đánh giá là true. Kiểm tra Máy chủ SQL cho NULL (ví dụ: không xác định) sử dụng ISIS NOT.

+0

+1 trên điều khoản so sánh. –

+1

+1 Hoặc sử dụng CTE thay vì truy vấn phụ. Họ đang pretttttttty! – MatBailie

+0

@ Dems - oh xin vui lòng ... đi ngủ ...;) –

Các vấn đề liên quan