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

जब मैं निम्नलिखित निष्पादित करने के लिए प्रयास करते समय मुझे त्रुटि प्राप्त:खंड में अस्थायी कॉलम का उपयोग नहीं कर सकता है?

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 

या आप शून्य

के लिए प्रत्येक व्यक्ति के क्षेत्र परीक्षण कर सकते हैं तुलनात्मक खंड पर
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

'<> न्यूल 'ओपी समस्याओं को देगा। यह इरादा सशर्त खंड नहीं है, मुझे विश्वास है। –

+1

@ शार्क - धन्यवाद, मुझे वह याद आया है। त्रुटि –

+3

+1 तय की गई है क्योंकि विकल्प 3 विकल्प 2 का एक अधिक व्यावहारिक रिएक्टर है, और अक्सर विकल्प 1 की तुलना में ऑप्टिमाइज़र के लिए एक और उपयोगी खंड है। * [यह कम सुरुचिपूर्ण महसूस कर सकता है, लेकिन जब यह निष्पादन योजना को कम करने के लिए अनुकूलक को अधिक सुराग देता है, तो उसे पैर मिलते हैं, और मुझे पैर पसंद हैं।] * – 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 

मैं हर बार पहले समाधान के साथ जाऊंगा।

भी ध्यान दें कि मैं करने के लिए

RowID is not NULL 

इसका कारण यह है <> NULL सच का मूल्यांकन कभी नहीं होगा

RowID <> NULL 

से अपने WHERE खंड बदल दिया है। (यानी अज्ञात) के लिए IS और IS NOT का उपयोग कर SQL सर्वर परीक्षण।

+0

+1। –

+1

+1 या उप-क्वेरी के बजाय एक सीटीई का उपयोग करें। वे सुंदर हैं! – MatBailie

+0

@ डेम्स - ओह कृपया ... बिस्तर पर जाएं ...;) –

संबंधित मुद्दे