SQL Server में #temptable
और क्या अंतर है ##TempTable
?
SQL Server में #temptable
और क्या अंतर है ##TempTable
?
जवाबों:
#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
इसे तोड़ो। एक ##
तालिका जिस प्रक्रिया में बनाई जाती है वह नियंत्रण प्रक्रिया होगी। यदि यह प्रक्रिया अभी भी ज़िंदा है तो हटाने के लिए तालिका को ध्वजांकित नहीं किया जाएगा, भले ही उस प्रक्रिया के विरुद्ध कोई कार्य न हो। एक बार जब ##
तालिका में बनाई गई प्रक्रिया समाप्त हो जाती है, तो अंतिम कार्य को उसके विरुद्ध निष्पादित होने पर हटाने के लिए टैग किया जाता है।
यहाँ यह देखने का एक सरल तरीका है। #
तालिकाओं को केवल उस प्रक्रिया के दायरे में उपलब्ध किया जाता है जो इसे बनाया गया था ##
, उसी तरह उपलब्ध हैं जैसे कि किसी अन्य तालिका को छोड़कर जो अस्तित्व में आती है और उस प्रक्रिया के साथ जाती है जो इसमें बनाई गई थी।
स्थानीय अस्थायी तालिकाएँ केवल उनके रचनाकारों को SQL सर्वर के उदाहरण के लिए उसी कनेक्शन के दौरान दिखाई देती हैं जब तालिकाएँ पहली बार बनाई गई थीं या संदर्भित थीं। स्थानीय अस्थायी तालिकाएँ SQL सर्वर के उदाहरण से उपयोगकर्ता डिस्कनेक्ट होने के बाद हटा दी जाती हैं। वैश्विक अस्थायी तालिकाएँ किसी भी उपयोगकर्ता और उनके द्वारा बनाए जाने के बाद किसी भी कनेक्शन के लिए दिखाई देती हैं, और तब हटा दी जाती हैं जब सभी उपयोगकर्ता जो SQL सर्वर के उदाहरण से तालिका डिस्कनेक्ट कर रहे हैं।
परीक्षण का सरल तरीका #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'.
जब आप तालिका के लिए चुनिंदा क्वेरी चलाते हैं: ## उसी सत्र की किसी भी क्वेरी विंडो में वैश्वीकरण योग्य, तो आपको क्वेरी रिटर्न मिलेगा।
"#" स्थानीय अस्थाई तालिकाओं को दर्शाता है
यह तालिका के नाम के उपसर्ग के रूप में एकल हैश मान "#" से शुरू होता है।
एक स्थानीय अस्थायी तालिका केवल उस कनेक्शन के लिए है जिसमें इसे
बनाया गया था। प्रत्येक स्थानीय अस्थायी तालिका में तालिका नाम के अंत में एक यादृच्छिक मान होता है।
एक स्थानीय अस्थायी तालिका स्वचालित रूप से हटा दी जाती है जब मौजूदा कनेक्शन बंद हो जाता है, या उपयोगकर्ता स्पष्ट रूप से इसे निम्न कमांड "ड्रॉप टेबल #TempTable" के साथ छोड़ सकता है।
यदि अस्थायी तालिका एक संग्रहीत प्रक्रिया में बनाई गई है, तो यह स्वचालित रूप से संग्रहीत प्रक्रिया निष्पादन के पूरा होने पर गिरा दी जाती है।
आप एक ही नाम से लेकिन एक अलग कनेक्शन में एक स्थानीय अस्थायी तालिका बना सकते हैं, और इसे विभिन्न यादृच्छिक मूल्यों के साथ एक ही नाम के साथ संग्रहीत किया जाता है।
# ## " ग्लोबल टेम्परेरी टेबल को दर्शाता है