#Temptable और ## TempTable में अंतर?


जवाबों:


34

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

##tableएक वैश्विक अस्थायी तालिका को संदर्भित करता है - सभी उपयोगकर्ताओं को दिखाई देता है


26

#TempTablesकेवल उपयोगकर्ता या कनेक्शन के लिए स्थानीय नहीं हैं। वे उस प्रक्रिया के लिए स्थानीय हैं, जिसने उन्हें बनाया है और कोई भी प्रक्रिया जो निर्माण प्रक्रिया को पैदा करती है। उदाहरण के लिए यदि मेरे पास निम्नलिखित हैं:

Declare @strDynamicSQL as varchar(8000)

Set @strDynamicSQL = 'Select GetDate() As TheDate Into #TheDateTable'
Execute(@strDynamicSQL)

Select *
From #TheDateTable

मुझे निम्नलिखित त्रुटि मिलती है:

Msg 208, स्तर 16, राज्य 0, पंक्ति 7 अमान्य ऑब्जेक्ट नाम '#TheDateTable'।

लेकिन अगर मैं:

Declare @strDynamicSQL as varchar(8000)

Create Table #TheDateTable (
    TheDate     DateTime
)

Set @strDynamicSQL = 'Insert Into #TheDateTable Select GetDate() As TheDate'
Execute(@strDynamicSQL)

Select *
From #TheDateTable

मुझे कोई त्रुटि नहीं मिली।

पहले उदाहरण में Executeकथन एक आड़ी प्रक्रिया में होता है। चूँकि उस प्रक्रिया में तालिका बनाई जाती है जब वह वापस आती है तो यह प्रक्रिया चली जाती है। और इस प्रक्रिया के साथ तालिका "बाय-बाय" है।

दूसरे उदाहरण में तालिका शीर्ष स्तर की प्रक्रिया द्वारा बनाई गई है। इसके बाद स्पावर्ड प्रक्रिया के साथ बातचीत की जाती है। तालिका उस प्रक्रिया के लिए उपलब्ध है जिसे यह बनाया गया था और यह किसी भी प्रक्रिया को जन्म देती है।

##tablesइसे तोड़ो। एक ##तालिका जिस प्रक्रिया में बनाई जाती है वह नियंत्रण प्रक्रिया होगी। यदि यह प्रक्रिया अभी भी ज़िंदा है तो हटाने के लिए तालिका को ध्वजांकित नहीं किया जाएगा, भले ही उस प्रक्रिया के विरुद्ध कोई कार्य न हो। एक बार जब ##तालिका में बनाई गई प्रक्रिया समाप्त हो जाती है, तो अंतिम कार्य को उसके विरुद्ध निष्पादित होने पर हटाने के लिए टैग किया जाता है।

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


10

स्थानीय अस्थायी तालिकाएँ केवल उनके रचनाकारों को SQL सर्वर के उदाहरण के लिए उसी कनेक्शन के दौरान दिखाई देती हैं जब तालिकाएँ पहली बार बनाई गई थीं या संदर्भित थीं। स्थानीय अस्थायी तालिकाएँ SQL सर्वर के उदाहरण से उपयोगकर्ता डिस्कनेक्ट होने के बाद हटा दी जाती हैं। वैश्विक अस्थायी तालिकाएँ किसी भी उपयोगकर्ता और उनके द्वारा बनाए जाने के बाद किसी भी कनेक्शन के लिए दिखाई देती हैं, और तब हटा दी जाती हैं जब सभी उपयोगकर्ता जो SQL सर्वर के उदाहरण से तालिका डिस्कनेक्ट कर रहे हैं।

यहां से ले गए

इस पर अधिक


4

परीक्षण का सरल तरीका #localtable and ##globaltable

एक अलग SQL क्वेरी विंडो में यह प्रयास करें

create table ##globaltemptable (id int )
go
insert into ##globaltemptable values (1)
go
select * from ##globaltemptable

एक अलग SQL क्वेरी विंडो में यह प्रयास करें

create table #localtemptable (id int )
go
insert into #localtemptable values (1)
go
select * from #localtemptable

अब यदि आप तालिका के लिए चुनिंदा क्वेरी चलाते हैं: # वैश्विक विंडो सिंटैक्स में #localtemptable, तो आपको एक त्रुटि मिलेगी: -

Invalid object name '#localtemptable'.

जब आप तालिका के लिए चुनिंदा क्वेरी चलाते हैं: ## उसी सत्र की किसी भी क्वेरी विंडो में वैश्वीकरण योग्य, तो आपको क्वेरी रिटर्न मिलेगा।


0

तालिका दिखाई / उपलब्ध होगी जब तक कि प्रक्रिया / कनेक्शन जो इसे बनाता है वह समाप्त होता है और केवल उस सत्र तक जो इसे बनाता है।

तालिका वैश्विक है और यह समाप्त होने वाली प्रक्रिया / सत्र तक सभी के लिए उपलब्ध होगी।


0

"#" स्थानीय अस्थाई तालिकाओं को दर्शाता है

  • यह तालिका के नाम के उपसर्ग के रूप में एकल हैश मान "#" से शुरू होता है।

  • एक स्थानीय अस्थायी तालिका केवल उस कनेक्शन के लिए है जिसमें इसे
    बनाया गया था। प्रत्येक स्थानीय अस्थायी तालिका में तालिका नाम के अंत में एक यादृच्छिक मान होता है।

  • एक स्थानीय अस्थायी तालिका स्वचालित रूप से हटा दी जाती है जब मौजूदा कनेक्शन बंद हो जाता है, या उपयोगकर्ता स्पष्ट रूप से इसे निम्न कमांड "ड्रॉप टेबल #TempTable" के साथ छोड़ सकता है।

  • यदि अस्थायी तालिका एक संग्रहीत प्रक्रिया में बनाई गई है, तो यह स्वचालित रूप से संग्रहीत प्रक्रिया निष्पादन के पूरा होने पर गिरा दी जाती है।

  • आप एक ही नाम से लेकिन एक अलग कनेक्शन में एक स्थानीय अस्थायी तालिका बना सकते हैं, और इसे विभिन्न यादृच्छिक मूल्यों के साथ एक ही नाम के साथ संग्रहीत किया जाता है।

# ## " ग्लोबल टेम्परेरी टेबल को दर्शाता है

  • यह तालिका के नाम के उपसर्ग के रूप में एकल हैश मान "##" से शुरू होता है और इसका नाम हमेशा अद्वितीय होता है।
  • नाम से कोई रैंडम नंबर जोड़ा नहीं गया है। SQL सर्वर के सभी कनेक्शन के लिए Global Temporary Tables दिखाई दे रहे हैं।
  • वैश्विक अस्थायी तालिकाएं केवल तब नष्ट हो जाती हैं जब तालिका को बंद करने वाला अंतिम कनेक्शन बंद हो जाता है (जिसमें हमने वैश्विक अस्थायी तालिका बनाई है)।
  • SQL सर्वर के सभी कनेक्शनों से वैश्विक अस्थायी तालिकाएँ तक पहुँच प्राप्त कर सकते हैं जब तक कि संदर्भ कनेक्शन खुला न हो।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.