2012-06-01 3 views
6

मुझे एक प्रश्न है जो तब होता है जब मैं अपनी स्क्रिप्ट में से किसी एक खंड में उपयोग कर रहा था। प्रश्न यह इंगित करना आसान है कि मैं बाहरी क्वेरी में केवल सीटीई उपनाम का उपयोग कई बार करना चाहता हूं और क्रूक्स है।टी-एसक्यूएल: सीटीई उपनाम का एकाधिक उपयोग - न केवल बाहरी क्वेरी

उदाहरण के लिए:

संदेश 208, स्तर 16, राज्य 1, रेखा 12 अमान्य ऑब्जेक्ट नाम: क्योंकि यह बाहरी क्वेरी के बाहर है

-- Define the CTE expression 
WITH cte_test (domain1, domain2, [...]) 
AS 
-- CTE query 
(
    SELECT domain1, domain2, [...] 
    FROM table 
) 
-- Outer query 
SELECT * FROM cte_test 
-- Now I wanna use the CTE expression another time 
INSERT INTO sometable ([...]) SELECT [...] FROM cte_test 

अंतिम पंक्ति निम्न त्रुटि को बढ़ावा मिलेगा 'cte_test'।

क्या सीटीई कई बार राहत का उपयोग करने का कोई तरीका है। इसे लगातार बनाओ? मेरा वर्तमान समाधान एक अस्थायी तालिका बनाना है जहां मैं सीटीई का परिणाम संग्रहीत करता हूं और किसी भी और बयान के लिए इस अस्थायी तालिका का उपयोग करता हूं।

-- CTE 
[...] 
-- Create a temp table after the CTE block 
DECLARE @tmp TABLE (domain1 DATATYPE, domain2 DATATYPE, [...]) 
INSERT INTO @tmp (domain1, domain2, [...]) SELECT domain1, domain2, [...] FROM cte_test 
-- Any further DML statements 
SELECT * FROM @tmp 
INSERT INTO sometable ([...]) SELECT [...] FROM @tmp 
[...] 

सचमुच, मुझे यह समाधान पसंद नहीं है। क्या किसी और के पास इस समस्या के लिए सबसे अच्छा अभ्यास है?

अग्रिम धन्यवाद!

+0

क्या आप अपने सीटीई के उपभोक्ता के रूप में 'SELECT' के बजाय 'OUTPUT' खंडों के साथ 'मर्ज' कथन का उपयोग करके अपना लक्ष्य पूरा कर सकते हैं? – HABO

+0

आप एक सीटीई से 'DELETE' क्यों करना चाहते हैं? – Johan

+1

@ जोहान: आगे का बयान मुद्दा नहीं है, कोई अन्य डीएमएल स्टेटमेंट जैसे 'INSERT' और c हो सकता है। – Neil

उत्तर

17

एक कॉमनटेबलएक्सप्रेस किसी भी तरह से डेटा को जारी नहीं रखता है। यह मूल रूप से मुख्य क्वेरी के पहले से ही उप-क्वेरी बनाने का एक तरीका है।

यह सामान्य उप-क्वेरी की तुलना में इन-लाइन दृश्य की तरह अधिक बनाता है। क्योंकि आप इसे बार-बार टाइप करने के बजाय बार-बार एक प्रश्न में संदर्भित कर सकते हैं।

लेकिन अभी भी इसे एक दृश्य के रूप में माना जाता है, जो संदर्भों में विस्तारित है, मैक्रो की तरह। डेटा का कोई भी अस्तित्व नहीं है।


यह आप के लिए दुर्भाग्य से, इसका मतलब है कि आप अपने आप को दृढ़ता से करना चाहिए।

  • यदि आप सीटीई के तर्क को जारी रखना चाहते हैं, तो आप एक इन-लाइन व्यू नहीं चाहते हैं, आप बस एक दृश्य चाहते हैं।

  • यदि आप सीटीई के परिणाम को जारी रखना चाहते हैं, तो आपको एक टेम्पलेट टेबल प्रकार का समाधान चाहिए, जैसे कि आपको पसंद नहीं है।

9

एक सीटीई केवल SQL कथन के लिए दायरे में है। यदि आपको बाद के वक्तव्य में अपने डेटा का पुन: उपयोग करने की आवश्यकता है, तो आपको डेटा को स्टोर करने के लिए एक अस्थायी तालिका या तालिका चर की आवश्यकता होती है। आपके उदाहरण में, जब तक कि आप एक रिकर्सिव सीटीई लागू नहीं कर लेते हैं, मुझे नहीं लगता कि सीटीई की आवश्यकता है - आप अपनी सामग्री को सीधे अस्थायी तालिका/तालिका चर में संग्रहीत कर सकते हैं और जितना चाहें उतना पुन: उपयोग कर सकते हैं।

यह भी ध्यान रखें कि आपका DELETE कथन अंतर्निहित तालिका से हटने का प्रयास करेगा, अगर आप परिणामों को एक अस्थायी तालिका/तालिका चर में डाल देंगे।

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