2012-08-16 11 views
44

मेरे पास एक क्वेरी है जिसे मुझे एक सार्थक कॉलम नाम आउटपुट करने के लिए गतिशील क्वेरी के रूप में चलाने की आवश्यकता है। उदाहरण के तौर पर, यदि मैं सीधे क्वेरी चलाता हूं, तो यह डेटा सही तरीके से देता है। हालांकि, अगर मैं नीचे दिए गए कोड का उपयोग करें, यह पता चलता है:निष्पादन विफल हुआ क्योंकि नाम वैध पहचानकर्ता नहीं है?

DECLARE @query NVARCHAR(4000) 
SET @query = N'SELECT * 
      FROM 
      (
       SELECT (CASE WHEN A.Domain IS NOT NULL THEN A.Domain ELSE B.Domain END) AS [Domain], 
         (CASE WHEN A.Email IS NOT NULL THEN A.Email ELSE B.Email END) AS [Email], 
         A.[Sender Size] AS [Sender Size 1], A.[Sender Count] AS [Sender Count 1], 
          A.[Receiver Size] AS [Receiver Size 1], A.[Receiver Count] AS [Receiver Count 1], 
         A.[Sender Size 2] AS [Sender Size 2], A.[Sender Count 2] AS [Sender Count 2], 
          A.[Receiver Size 2] AS [Receiver Size 2], A.[Receiver Count 2] AS [Receiver Count 2], 
         B.SenderSize AS [Sender Size Average], B.SenderCount AS [Sender Count Average], 
          B.ReceiverSize AS [Receiver Size Average], B.ReceiverCount AS [Receiver Count Average] 
       FROM 
        (
        SELECT (CASE WHEN tf.Domain IS NOT NULL THEN tf.Domain ELSE tf2.Domain END) AS Domain, 
          (CASE WHEN tf.Email IS NOT NULL THEN tf.Email ELSE tf2.Email END) AS Email, 
         ISNULL(tf.SenderSize,0) AS [Sender Size] , ISNULL(tf.SenderCount,0) AS [Sender Count], ISNULL(tf.ReceiverSize,0) AS [Receiver Size], ISNULL(tf.ReceiverCount,0) AS [Receiver Count], 
         ISNULL(tf2.SenderSize,0) AS [Sender Size 2], ISNULL(tf2.SenderCount,0) AS [Sender Count 2], ISNULL(tf2.ReceiverSize,0) AS [Receiver Size 2], ISNULL(tf2.ReceiverCount,0) AS [Receiver Count 2] 
        FROM #TrafficFinal tf FULL JOIN #TrafficFinal2 tf2 ON (tf.Email = tf2.Email AND tf.Domain = tf2.Domain) 
        ) A FULL JOIN #TrafficFinal3 B ON (A.Email = B.Email AND A.Domain = B.Domain) 
      ) C 
      ORDER BY Domain, Email';  

PRINT @query; 

-- run it 
exec @query; 

यह क्योंकि पूर्ण में शामिल होने की है:

The name ' 
      SELECT (CASE WHEN A.Domain IS NOT NULL THEN A.Domain ELSE B.Domain END) AS [Domain], 
        (CASE WHEN A.Email IS NOT NULL THEN A.Email ELSE B.Email END) AS [Email], 
        A.[Sender Size] AS [Sender Size 1], A.[Sender Count] AS [Sender Count 1], 
         A.[Receiver Size] AS [Receiver Size 1], A.[Receiver Count] AS [Receiver Count 1], 
        A.[Sender Size 2] AS [Sender Size 2], A.[Sender Count 2] AS [Sender Count 2], 
         A.[Receiver Size 2] AS [Receiver Size 2], A.[Receiver Count 2] AS [Receiver Count 2], 
        B.SenderSize AS [Sender Size Average], B.SenderCount AS [Sender Count Average], 
         B.ReceiverSize AS [Receiv' is not a valid identifier. 

यह नीचे कोड है?

+0

इसके बारे में खेद है। मुझे यह पता लगाने में थोड़ी देर लग गई कि चेक प्रतीक पर क्लिक किया जा सकता है। – urlreader

उत्तर

155

बजाय अंत में इस प्रयास करें:

exec (@query) 

आप कोष्ठक नहीं है, तो, एसक्यूएल सर्वर चर का मान मान लिया गया एक संग्रहीत प्रक्रिया नाम हो।

या

EXECUTE sp_executesql @query 

और यह पूर्ण की वजह से नहीं होना चाहिए शामिल हों।
लेकिन मुझे उम्मीद है कि आप पहले ही temp टेबल बना चुके हैं: # ट्रैफिकफिनल, # ट्रैफिकफिनल 2, # ट्रैफिकफिन 3 इससे पहले।


कृपया ध्यान दें कि EXEC और sp_executesql का उपयोग करने के बीच प्रदर्शन विचार हैं। चूंकि sp_executesql एक स्पैम की तरह मजबूर कथन कैशिंग का उपयोग करता है।
अधिक जानकारी here


एक और नोट पर, वहाँ एक कारण है कि आप इस मामले के लिए गतिशील एसक्यूएल का उपयोग कर रहे हैं, जब आप उसी रूप में क्वेरी का उपयोग कर सकते हैं, तो आप किसी भी प्रश्न जोड़तोड़ नहीं कर रहे हैं और यह जिस तरह से यह है क्रियान्वित करने पर विचार है?

+1

आपको बहुत धन्यवाद, मुझे पता था कि मुझे कुछ आसान याद आया! :) – urlreader

+0

ऐसा इसलिए है क्योंकि कॉलम शीर्षक, यानी रिसीवर गणना 1, ..., दिनांक चर द्वारा उपयोगकर्ता के अनुकूल होने की आवश्यकता है। – urlreader

+1

मैं बस एक ही समस्या में भाग गया, समाधान के लिए धन्यवाद। मुझे मूर्ख नहीं लगता क्योंकि यह इतना आसान था। – Jackson

0

के रूप में मेरे मामले में था, तो अपने एसक्यूएल या श्रृंखलाबद्ध द्वारा उत्पन्न होता है का उपयोग करता है धर्मान्तरित तो जरूरत पर अमल में sql

जैसे नीचे के रूप में पत्र एन के साथ उपसर्ग जा करने के लिए

Exec N'Select bla..' 

एन स्ट्रिंग अक्षर परिभाषित करता है यूनिकोड है।

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