2009-12-11 5 views
5

का उपयोग करता है मेरे पास कुछ जटिल संग्रहित प्रक्रियाएं हैं जो लिंक किए गए सर्वरों का उपयोग करके अन्य डेटाबेस से डेटा खींचती हैं। यह डेटा अस्थायी तालिकाओं में डाल दिया गया है जो आउटपुट के लिए एक चयन क्वेरी में शामिल हो गए हैं। प्रक्रियाएं ठीक काम करती हैं लेकिन विजुअल स्टूडियो में यदि मैं डिज़ाइनर का उपयोग करके संग्रहीत प्रक्रिया को किसी डेटासेट में जोड़ने का प्रयास करता हूं तो मुझे त्रुटि अमान्य ऑब्जेक्ट नाम #tmp या जो भी पहली temp तालिका कहा जाता है। यह डेटाबेस स्कीमा को पुनः प्राप्त करने में असमर्थ है। यह ASP.NET में उपयोग और sqldatasource के लिए समान है।संग्रहीत प्रक्रिया के विजुअल स्टूडियो में फ़ील्ड स्कीमा पुनर्प्राप्त करें जो temp tables

प्रक्रिया अभी भी प्रयोग योग्य है, लेकिन मुझे डेटा को मैन्युअल रूप से सभी कॉलम जोड़ना होगा जो इसे डेटाटेबल को आउटपुट करना चाहिए। यह मैन्युअल रूप से करने के लिए दर्द होने जा रहा है और मुझे लगता है कि दृश्य स्टूडियो संग्रहीत प्रक्रिया से आउटपुट फ़ील्ड को इकट्ठा करने के तरीके से करना है, ऐसा लगता है कि यह सामान्य तरीके से नहीं चल रहा है। क्या इसे ठीक करने का कोई तरीका है क्योंकि मेरे पास बहुत कुछ करना है और मैन्युअल रूप से सभी कॉलम जोड़ना नहीं चाहते हैं, जो समय लेने वाली और त्रुटि प्रवण है।

+0

क्या कोई कारण है कि आप संग्रहित प्रक्रिया के बजाय तालिका-मूल्य फ़ंक्शन का उपयोग नहीं कर सकते हैं? – Wilhelm

+0

हाँ, जहां तक ​​मुझे पता है कि आप फ़ंक्शन में गतिशील SQL या openquery का उपयोग नहीं कर सकते हैं। अगर मैं ग़लत हूं तो मेरी गलती सुझाएं। – PeteT

+0

अधिक शोध के बाद मेरे स्वयं के प्रश्न का उत्तर दिया। एक विचित्र समाधान है। – PeteT

उत्तर

12

थोड़ी देर के लिए googling के बाद मैं एक विचित्र समाधान डाल पाया। यह कोड स्पष्ट रूप से कभी नहीं चलता है लेकिन यह समस्या हल करता है। FMTONLY केवल संग्रहीत प्रक्रिया के बारे में मेटा डेटा लौटने से संबंधित है।

सेट FMTONLY बंद

मैं जानता हूँ कि क्यों किसी में यदि अन्य पोस्ट में 1 = 0 डाल मत: मैं एसक्यूएल सर्वर 2005

+1

चेतावनी! ध्यान रखें कि जब आप ऐसा करते हैं, तो संग्रहीत प्रक्रिया वास्तव में पूरी तरह से निष्पादित की जाएगी और जब भी विजुअल स्टूडियो डिजाइनर इसे जांचता है तो प्रतिबद्ध किया जाएगा। यदि आपके पास अपनी proc में कोई अपडेट/डिलीट/सम्मिलित कथन है, तो वे चलाए जाएंगे। केवल उन प्रक्रियाओं पर इसका उपयोग करें जो केवल डेटा लौटाते हैं। अन्यथा, यह एक उत्कृष्ट खोज है! –

0

मेटाडेटा को पढ़ नहीं सकता है क्योंकि आपके पास # टेम्पलेट टेबल है और यह temp तालिका नहीं ढूंढ सकता है। आप मेटाडाटा को परिभाषित करने के लिए एक TOP 0 क्वेरी

SELECT TOP 0 
    CONVERT (NULL, VarChar (30)) AS Column1, 
    CONVERT (NULL, INTEGER) AS Column2, 
    CONVERT (NULL, DECIMAL (9, 2)) AS Column3, 
    CONVERT (NULL, VarChar (55)) AS Column4 

UNION 

SELECT * 
FROM #MyTempTable 
+0

इस तरह से सेमेज़ लगभग लंबे समय तक लगेंगे, मुझे नहीं लगता कि दृश्य स्टूडियो सामान्य रूप से क्वेरी को चलाकर मेटा डेटा क्यों प्राप्त नहीं कर सकता है क्योंकि उदाहरण के लिए क्रिस्टल रिपोर्ट परेशानी के बिना ऐसा कर सकती है। – PeteT

0

कारण तुम यहाँ मेटा डेटा प्राप्त नहीं कर सकता है, क्योंकि यह डेटा पर निर्भर कर सकता है का उपयोग करके इसे चारों ओर पाने के लिए कोशिश कर सकते हैं। उदाहरण के लिए।

If Exists(Select 1 From Table Where Column1 = 7) 
    Select Col1, Col2 From Table2 
Else 
    Select Col3, Col4, Col5 From Table2 

मैं कभी भी संग्रहीत प्रक्रिया नहीं लिखूंगा जिसमें डेटा के आधार पर कॉलम की एक अलग संख्या हो, लेकिन यह करना संभव है। बस एक पल के लिए, मान लें कि आपके पास इस तरह की एक संग्रहीत प्रक्रिया थी। क्या कॉलम सूची वापस की जानी चाहिए? डिजाइनर सही ढंग से स्कीमा जानकारी पाने के लिए अनुमति देता है

IF 1=0 BEGIN 
SET FMTONLY OFF 
END 

अपने संग्रहीत प्रक्रिया के शुरू में:

+0

हाँ मैं इसे समझता हूं और मैं कभी भी ऐसा नहीं लिखूंगा जहां यह संभावित रूप से कॉलम की एक अलग संख्या लौटाएगा। लेकिन मैं निर्दिष्ट चर के लिए कॉलम क्यों नहीं प्राप्त करता हूं। – PeteT

+0

क्योंकि यह अभी भी निर्धारिती नहीं हो सकता है। यह भी मान लें कि एक संग्रहीत प्रक्रिया कोई रिकॉर्डसेट, एक रिकॉर्डसेट, या यहां तक ​​कि एकाधिक रिकॉर्डसेट वापस नहीं कर सकती है। आप यादृच्छिक संख्या फ़ंक्शंस का भी उपयोग कर सकते हैं ताकि प्रत्येक कॉल अलग-अलग कॉलम लौटा सके। –

+0

हाँ, लेकिन इसका उपयोग केवल डिजाइनर के लिए किया जा रहा है, डेवलपर जानता है कि आखिरकार कॉलम को अंत में मौजूद होने की आवश्यकता है, यह आपके लिए संग्रहीत प्रो के लिए दिए गए मानों के आधार पर उन्हें आपके लिए रखने के लिए तेज़ है। एक उदाहरण क्रिस्टल रिपोर्ट है जो आपके द्वारा दिए गए मानों को लेता है और एक संग्रहीत प्रक्रिया को अंतिम डेटाटेबल खींचता है। इससे कोई फर्क नहीं पड़ता कि वे रनटाइम पर मौजूद नहीं हो सकते हैं क्योंकि यह हमेशा वैसे भी मामला है क्योंकि आप किसी भी एसक्यूएल क्वेरी को आसानी से बदल सकते हैं। – PeteT

2

यह मेरे लिए काम करता उपयोग कर रहा हूँ? मुझे लगता है कि यह साबित करने के लिए था कि जब FMTONLY चालू है कि आईएफ/ईएलएसई वक्तव्य में सभी शर्तों को निष्पादित किया गया है!

एफएमटीटीई आमतौर पर एसएसआरएस और विजुअल स्टूडियो जैसे अनुप्रयोगों द्वारा चालू किया जाता है जब एक एसटीपी के लिए स्कीमा जानकारी को ताज़ा करते हैं। FMTONLY के साथ कोई कथन निष्पादित नहीं किया जाता है केवल कॉलम नाम लौटाए जाते हैं। मुद्दा यह है कि क्योंकि कोई कथन निष्पादित नहीं किया जाता है, इसलिए temp तालिका नहीं बनाई जाती है, और इसलिए temp तालिका पर किसी भी चयन कथन द्वारा लौटाए गए कॉलम अज्ञात हैं।

FMTONLY ON को सेट करने से stp पूरी तरह से चलने का कारण बन जाएगा। यदि आपके पास आपके एसटीपी में कोई भी सम्मिलित/अपडेट/डिलीट कथन है, तो वे दौड़ेंगे, इसलिए इसे बंद करने से पहले एफएमटीटीई की स्थिति को कैप्चर करें और अपडेट को रोकने के लिए उचित उपाय करें।

आप यह निर्धारित कर सकते हैं कि FMTONLY जांच कर रहा है कि क्या 1 = 0. यदि यह करता है तो FMTONLY चालू है और आप केवल उन कॉलम का एक साधारण चयन चला सकते हैं, जो आपका सामान्य रूप से वापस आते हैं।

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