SQL सर्वर टेबल: @, # और ## के बीच अंतर क्या है?


जवाबों:


114

#table एक स्थानीय को संदर्भित करता है (केवल उस उपयोगकर्ता को दिखाई देता है जिसने इसे बनाया है) अस्थायी तालिका।

##table एक वैश्विक (सभी उपयोगकर्ताओं के लिए दृश्यमान) अस्थायी तालिका को संदर्भित करता है।

@variableName एक चर को संदर्भित करता है जो अपने प्रकार के आधार पर मूल्यों को पकड़ सकता है।


31
आपकी पसंद की परिभाषा पूरी तरह से सही नहीं है। यह उपयोगकर्ता तक सीमित नहीं है, बल्कि कनेक्शन है। यदि किसी उपयोगकर्ता के पास कई कनेक्शन हैं, तो यह केवल उस कनेक्शन को दिखाई देगा, जिसने पहली बार #table बनाया था।
डेविन स्टडर

@DavinStuder ने एक महत्वपूर्ण स्पष्टीकरण की पेशकश की है। उपयोगकर्ता के लिए दिखाई देने वाली एक तालिका बनाम केवल वर्तमान कनेक्शन पर दिखाई देने वाली तालिका के बीच अंतर बहुत महत्वपूर्ण है।
मिर्ज़मास्टर

@DavinStuder उपयोगकर्ता के लिए कई कनेक्शन कैसे देखें? एक ही कनेक्शन स्ट्रिंग?
किकेनीत

24

4
मुझे लगता है कि यह बहुत पहले से है, लेकिन चूंकि यह लिंक-ओनली उत्तर है (और पहला लिंक मृत है), क्या इसे प्रत्येक लिंक से मुख्य टेकअवे के साथ अपडेट किया जा सकता है?
माइक गुथरी

7

#और ##टेम्‍प्स डेटाबेस में दर्शाई गई टेबल वास्तविक टेबल हैं। इन तालिकाओं में अनुक्रमित और आँकड़े हो सकते हैं, और एक सत्र में स्प्रोक्स तक पहुँचा जा सकता है (वैश्विक अस्थायी तालिका के मामले में, यह सत्रों में उपलब्ध है)।

@ तालिका तालिका चर है।

अधिक के लिए: http://www.sqlteam.com/article/temporary-tables


4
और टेबल चर भी tempDB डेटाबेस में रहेगा, अगर इसका आकार मेमोरी में रखने के लिए बहुत बड़ा है।
marc_s

5

मैं #table और @table के बीच के अंतरों पर ध्यान केंद्रित करूँगा। ## तालिका एक वैश्विक अस्थायी तालिका है और SQL सर्वर I का उपयोग करने के 10 वर्षों में रिकॉर्ड के लिए मुझे अभी तक एक वैध उपयोग के मामले में आना है। मुझे यकीन है कि कुछ मौजूद हैं लेकिन वस्तु की प्रकृति इसे अत्यधिक अनुपयोगी IMHO बनाती है।

@Marc_s द्वारा @whiner की प्रतिक्रिया बिल्कुल सच है: यह एक प्रचलित मिथक है कि टेबल चर हमेशा स्मृति में रहते हैं। यह वास्तव में एक टेबल चर के लिए डिस्क पर जाने और एक अस्थायी तालिका की तरह संचालित करने के लिए काफी आम है।

वैसे भी मेरा सुझाव है कि @Astander द्वारा बताए गए लिंक का अनुसरण करके मतभेदों के सेट पर पढ़ना। अंतर के अधिकांश में उन सीमाओं को शामिल किया गया है जो आप @table चर के साथ नहीं कर सकते हैं।


मेरे पास 5 अलग-अलग संग्रहीत प्रक्रियाएं हैं जो एक गणना के विभिन्न भागों का प्रदर्शन करती हैं और एक ही परिणाम का उत्पादन करती हैं। ऑडिटिंग के लिए मैं मध्यवर्ती मूल्यों को देखना चाहता हूं और इसी तरह ऑडिटर भी। मैंने अपनी प्रक्रियाओं को एक ## टेम्‍प टेबल में कुछ डंप करने के लिए समायोजित किया ताकि हम दोनों उन्हें देख सकें लेकिन वे बरकरार नहीं हैं (वे केवल ऑडिट के दौरान आवश्यक हैं)। आपके (IMHO!) के लिए वैध उपयोग का मामला है।
रैनफैस्कॉटलैंड

जब आप dbo.Table का उपयोग कर सकते हैं तो #Ryan ## टेबल वैध क्यों है? मैं इसे एक वैध उपयोग के मामले में नहीं मानता जब आपने किया है, अपने आप को DROP कथन लिखने से बचाया है।
हारून बर्ट्रेंड

4
मैं अपने डीबी पर ऑडिटर डीआरओपी की अनुमति नहीं देना चाहता। मैं यह भी नहीं चाहता कि उसके आने के बाद वह वापस आ जाए और चुस्त-दुरुस्त रहे। एक अस्थायी तालिका के साथ वह क्वेरी को जितनी बार चाहें चला सकता है और मुझे पता है कि जब वह किया जाता है तो वह डीबी में पदचिह्न नहीं छोड़ रहा है।
रयानफेस्कॉटलैंड

4
CREATE TABLE #t

एक ऐसी तालिका बनाता है जो केवल उस पर दिखाई देती है और उस कनेक्शन के दौरान वही उपयोगकर्ता जो दूसरा कनेक्शन बनाता है, वह दूसरे कनेक्शन से तालिका #t नहीं देख पाएगा।

CREATE TABLE ##t

अन्य कनेक्शन के लिए दिखाई देने वाली एक अस्थायी तालिका बनाता है। लेकिन निर्माण कनेक्शन समाप्त होने पर तालिका को गिरा दिया जाता है।


SqlConnection.Open()साथ ही कनेक्शन स्ट्रिंग है एक ही कनेक्शन ?
किनिकेत

2
नहीं, यह एक ही डेटाबेस से एक कनेक्शन है, लेकिन लगभग निश्चित रूप से एक ही कनेक्शन नहीं है।
मार्कस

0

यदि आपको एक अद्वितीय वैश्विक अस्थायी तालिका की आवश्यकता है, तो एक योजक या उपसर्ग / प्रत्यय के साथ अपना स्वयं का बनाएं और यदि एक if__ (.... एकमात्र दोष यह है कि डायनेमिक sql का उपयोग कर रहा है और स्पष्ट रूप से ड्रॉप करने की आवश्यकता है)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.