ऐसा लगता है कि एक्सेक्यूट स्ट्रिंग विधि के माध्यम से गतिशील एसक्यूएल का उपयोग करके बनाए गए #temptables एक अलग दायरे हैं और उसी संग्रहित प्रक्रिया में "निश्चित" एसक्यूएल द्वारा संदर्भित नहीं किया जा सकता है। हालांकि, मैं बाद में गतिशील एसक्यूएल में एक गतिशील एसक्यूएल कथन द्वारा बनाई गई एक टेम्प तालिका को संदर्भित कर सकता हूं लेकिन ऐसा लगता है कि एक संग्रहीत प्रक्रिया एक कॉलिंग क्लाइंट को क्वेरी परिणाम नहीं लौटाती जब तक कि SQL तय नहीं हो जाता।टी-एसक्यूएल डायनेमिक एसक्यूएल और टेम्प टेबल्स
एक साधारण 2 तालिका परिदृश्य: मेरे पास 2 टेबल हैं। आइए उन्हें ऑर्डर और आइटम कॉल करें। ऑर्डर में ऑर्डर आईडी की प्राथमिक कुंजी है और आइटम में आइटम आईडी की प्राथमिक कुंजी है। आइटम। ऑर्डर आईडी मूल आदेश की पहचान करने के लिए विदेशी कुंजी है। एक आदेश में 1 से एन आइटम हो सकते हैं।
मैं उपयोगकर्ता को यह देखने के लिए उपयोगकर्ता को एक बहुत ही लचीला "क्वेरी बिल्डर" प्रकार इंटरफ़ेस प्रदान करने में सक्षम होना चाहता हूं कि वह कौन से आइटम देखना चाहता है। फ़िल्टर मानदंड आइटम तालिका के फ़ील्ड और/या अभिभावक आदेश तालिका से फ़ील्ड पर आधारित हो सकते हैं। यदि कोई आइटम फिल्टर स्थिति को पूरा करता है जिसमें माता-पिता आदेश पर शर्त और शर्त है, तो कोई भी मौजूद है, आइटम क्वेरी में और मूल ऑर्डर में वापस आना चाहिए।
आमतौर पर, मुझे लगता है कि अधिकांश लोग आइटम तालिका और अभिभावक ऑर्डर टेबल के बीच एक संयोजन बनाएंगे। मैं इसके बजाय 2 अलग-अलग प्रश्नों को निष्पादित करना चाहता हूं। सभी योग्यता प्राप्त करने वाले सभी आइटम वापस करने के लिए सभी योग्यता आइटम और दूसरे को वापस करने के लिए। कारण दो गुना है और आप सहमत हो सकते हैं या नहीं भी।
पहला कारण यह है कि मुझे मूल ऑर्डर तालिका में सभी कॉलम से पूछताछ करने की आवश्यकता है और यदि मैंने आइटम तालिका में ऑर्डर तालिका में शामिल होने के लिए एक ही प्रश्न किया है, तो मैं ऑर्डर जानकारी को कई बार दोहराता हूं। चूंकि आम तौर पर प्रति ऑर्डर की बड़ी संख्या में आइटम होते हैं, इसलिए मैं इससे बचना चाहता हूं क्योंकि इसके परिणामस्वरूप वसा ग्राहक को अधिक डेटा स्थानांतरित किया जा सकता है। इसके बजाए, जैसा कि बताया गया है, मैं डेटासेट में अलग-अलग दो टेबल वापस करना चाहता हूं और एक कस्टम ऑर्डर और चाइल्ड आइटम क्लाइंट ऑब्जेक्ट्स को पॉप्युलेट करने के लिए दो तालिकाओं का उपयोग करना चाहता हूं। (मुझे अभी तक LINQ या Entity Framework के बारे में पर्याप्त जानकारी नहीं है। मैं हाथ से अपनी वस्तुओं का निर्माण करता हूं)। दूसरा कारण है कि मैं एक के बजाय दो टेबल वापस करना चाहता हूं क्योंकि मेरे पास पहले से ही एक और प्रक्रिया है जो किसी ऑर्डर आईडी के लिए सभी ऑर्डर देता है, ऑर्डर के साथ और मैं उसी 2-टेबल दृष्टिकोण का उपयोग करना चाहता हूं ताकि मैं वापस लौटे 2 डेटाटेबल्स से मेरे कस्टम ऑर्डर और क्लाइंट ऑब्जेक्ट्स को पॉप्युलेट करने के लिए क्लाइंट कोड का पुन: उपयोग कर सकता है।
मैं ऐसा करने की उम्मीद कर रहा था क्या यह था:
ग्राहक के रूप में Winform पर बनाया कस्टम फ़िल्टर द्वारा निर्दिष्ट जो आइटम तालिका और प्रत्येक तालिका पर उपयुक्त फिल्टर करने के लिए आदेश तालिका संयोजन पर एक गतिशील एसक्यूएल स्ट्रिंग का निर्माण वसा-ग्राहक ऐप। ग्राहक पर एसक्यूएल निर्माण कुछ इस तरह देखा होगा:
TempSQL = "
INSERT INTO #ItemsToQuery
OrderId, ItemsId
FROM
Orders, Items
WHERE
Orders.OrderID = Items.OrderId AND
/* Some unpredictable Order filters go here */
AND
/* Some unpredictable Items filters go here */
"
फिर, मैं एक संग्रहीत प्रक्रिया कहेंगे,
CREATE PROCEDURE GetItemsAndOrders(@tempSql as text)
Execute (@tempSQL) --to create the #ItemsToQuery table
SELECT * FROM Items WHERE Items.ItemId IN (SELECT ItemId FROM #ItemsToQuery)
SELECT * FROM Orders WHERE Orders.OrderId IN (SELECT DISTINCT OrderId FROM #ItemsToQuery)
इस दृष्टिकोण के साथ समस्या यह है कि #ItemsToQuery तालिका है, क्योंकि यह था गतिशील एसक्यूएल द्वारा निर्मित, निम्नलिखित 2 स्थैतिक एसक्यूएल से पहुंच योग्य नहीं है और यदि मैं स्थैतिक एसक्यूएल को गतिशील में बदलता हूं, तो वसा क्लाइंट को कोई परिणाम वापस नहीं भेजा जाता है।
3 चारों ओर मन के लिए आते हैं, लेकिन मैं एक बेहतर एक के लिए देखो कर रहा हूँ:
1) पहली एसक्यूएल ग्राहक से गतिशील रूप से निर्माण किया एसक्यूएल को क्रियान्वित करते हुए प्रदर्शन किया जा सकता है। इसके बाद परिणाम उपरोक्त संग्रहीत प्रक्रिया के एक संशोधित संस्करण में एक तालिका के रूप में पारित किया जा सकता है। मैं एक्सएमएल के रूप में टेबल डेटा पास करने से परिचित हूं। अगर मैंने ऐसा किया, तो संग्रहित प्रो डेटा को स्थिर एसक्यूएल का उपयोग करके एक अस्थायी तालिका में डाल सकता है, क्योंकि यह गतिशील एसक्यूएल द्वारा बनाया गया था, फिर बिना किसी समस्या के पूछताछ की जा सकती है।(मैं एक्सएमएल के बजाय नए टेबल टाइप परम को पार करने में भी जांच कर सकता हूं।) हालांकि, मैं संग्रहित प्रक्रिया में संभावित रूप से बड़ी सूचियों को पार करने से बचना चाहता हूं।
2) मैं ग्राहक से सभी प्रश्नों को निष्पादित कर सकता हूं।
SELECT Items.* FROM Orders, Items WHERE Order.OrderId = Items.OrderId AND (dynamic filter)
SELECT Orders.* FROM Orders, Items WHERE Order.OrderId = Items.OrderId AND (dynamic filter)
यह अभी भी मुझे मेरे मुवक्किल पक्षीय वस्तु आबादी कोड पुन: उपयोग करने क्योंकि आदेश और आइटम दो अलग-अलग तालिकाओं में लौटा दी करने के लिए जारी की क्षमता के साथ प्रदान करता है:
पहले कुछ इस तरह होगा।
मुझे यह महसूस हो रहा है कि मेरे पास मेरे संग्रहित प्रो में टेबल डेटा प्रकार का उपयोग करके कुछ विकल्प हो सकते हैं, लेकिन यह मेरे लिए भी नया है और मैं उस पर थोड़ा सा चम्मच खाने की सराहना करता हूं।
यदि आपने जो भी लिखा है, उसमें आपने इसे स्कैन भी किया है, तो मुझे हैरान है, लेकिन यदि ऐसा है, तो मैं इस सर्वोत्तम विचार को पूरा करने के बारे में आपके किसी भी विचार को डरता हूं।
टीएलडीआर: http://www.urbandictionary.com/define.php?term=TLDR –