2012-01-18 15 views
5

मैं ओरेकल 11 जी ग्लोबल अस्थायी टेबल्स का उपयोग कर रहा हूं क्योंकि मुझे एक समाधान की आवश्यकता है जहां मैं शामिल होने के लिए एक अस्थायी तालिका में पंक्तियां जोड़ सकता हूं, और मैं चाहता हूं कि पंक्तियों में केवल पंक्तियां शामिल हों ओरेकल कनेक्शन/सत्र शामिल किया जाना है। मैं ओरेकल में ग्लोबल टेम्पप टेबल का उपयोग कर रहा हूं क्योंकि मैं चाहता हूं कि तालिका सत्रों के बीच मौजूद हो, इसलिए जब भी मैं कोई प्रश्न बनाउंगा तब इसे फिर से तैयार नहीं किया जाना चाहिए। यह ठीक काम कर रहा है।ग्लोबल टेम्प टेबल्स - एसक्यूएल सर्वर बनाम ओरेकल

CREATE GLOBAL TEMPORARY TABLE book_id_temp 
( 
    book_id RAW(32) 
)ON COMMIT DELETE ROWS; 

मैं एसक्यूएल सर्वर 2008 आर 2-पक्ष पर भी एक ही डेटाबेस संरचना है, और SQL सर्वर में एक ऐसी ही समाधान की जरूरत है:

मेरे Oracle तालिका परिभाषा इस प्रकार है। मैं चाहता हूँ करने के लिए:

  1. ओपन किसी SQL कनेक्शन (ADO.NET)
  2. किसी लेन-देन के भीतर:
  3. एक अस्थायी तालिका में जोड़ें पंक्तियाँ।
  4. - उन्हें किसी अन्य तालिका में शामिल करें, परिणाम
  5. - केवल इस सत्र के दौरान जोड़े गए पंक्तियों को शामिल करने के लिए शामिल करें। एक और धागा एक ही अस्थायी तालिका पर निष्पादित हो सकता है। यह तब संभव है कि एक स्थानीय अस्थायी तालिका यहां सबसे अच्छी होगी?
  6. पूरे लेनदेन को रोलबैक करें।

जो मैंने SQL सर्वर में वैश्विक अस्थायी तालिकाओं के बारे में पढ़ा है, एक कनेक्शन समाप्त होने के बाद तालिकाएं समाप्त होती हैं, नियमित तालिका की तरह, और ओरेकल में ग्लोबल टेम्पप टेबल की तरह। हालांकि, यह डेटा के दायरे पर स्पष्ट नहीं है। क्या केवल SQL सर्वर सत्र जो पंक्तियों को बनाता है, उस तक पहुंच है, जैसे ओरेकल में? एसक्यूएल सर्वर ग्लोबल टेम्प टेबल्स के साथ डेटा की पहुंच क्षमता क्या है? क्या आपके पास अपना लक्ष्य प्राप्त करने के लिए एक विकल्प का सुझाव है?

USE tempdb; 

CREATE TABLE foo... 

और फिर उन्हें पता::

select * from tempdb..foo 

इन तालिकाओं सत्र के बीच हटाए नहीं जाएंगे

+0

ओरेकल वैश्विक अस्थायी टेबल भी, कटा हुआ आपरेशन के आधार पर की जरूरत है ... मैं एक मेज चर एसक्यूएल सर्वर में एक अस्थायी तालिका विकल्प दिया से अधिक का उपयोग करेंगे, लेकिन आप की जरूरत है वास्तविक सहायता प्राप्त करने के लिए कनेक्शन खो जाने पर दृढ़ता के लिए अपनी आवश्यकता की व्याख्या करें। क्यों न केवल एक वास्तविक टेबल बनाते हैं? –

+0

मैं चाहता हूं कि तालिका सत्रों के बीच मौजूद हो, इसलिए जब भी मैं कोई प्रश्न बनाउंगा तब इसे फिर से तैयार नहीं किया जाना चाहिए। –

+0

यह * लगता है * जैसे आप एक वैश्विक अस्थायी तालिका की बजाय एक स्थानीय अस्थायी तालिका चाहते हैं। क्या आप वर्णन कर सकते हैं कि आपको * क्या आवश्यक अर्थशास्त्र * चाहिए? –

उत्तर

6

ओरेकल में अस्थायी सारणी स्थायी वस्तुएं हैं जो अस्थायी डेटा है जो सत्र स्थानीय है। SQL सर्वर में अस्थायी सारणी अस्थायी वस्तुएं हैं।

  1. SQL सर्वर में, एक वैश्विक temp तालिका में सभी सत्रों के लिए दृश्यमान डेटा होता है। "ग्लोबल अस्थायी टेबल किसी भी उपयोगकर्ता और उनके निर्माण के बाद किसी भी कनेक्शन के लिए दृश्यमान होते हैं।" http://msdn.microsoft.com/en-us/library/ms186986.aspx
  2. वैश्विक अस्थायी सारणी अभी भी अस्थायी वस्तुएं हैं जो अनिश्चित काल तक नहीं टिकती हैं, और उपयोग से पहले बनाई जानी चाहिए। "ग्लोबल अस्थायी टेबल ... हटा दिए जाते हैं जब तालिका का संदर्भ देने वाले सभी उपयोगकर्ता SQL सर्वर के उदाहरण से डिस्कनेक्ट होते हैं।" http://msdn.microsoft.com/en-us/library/ms186986.aspx

मुझे लगता है कि एक स्थानीय अस्थायी तालिका, या तालिका चर, ओरेकल के वैश्विक अस्थायी तालिका के लिए एक ही किया जा रहा है के सबसे करीब है, बड़ा अंतर आप इसे हर बार बनाने के लिए है।

आमतौर पर, तुम्हारा तरह के मामले में, चरण 3, पंक्तियों अस्थायी तालिका में जोड़, http://msdn.microsoft.com/en-us/library/ms188029.aspx

इसके अलावा (Oracle create table ... as select ... के बराबर) एक select ... into #temp_table_name .... करके किया जा सकता है, यदि आप एक के बाद ऐसा नहीं कर सकते संग्रहीत proc: (छद्म कोड।)

begin proc 
    call another proc to create local temp table. 
    use temp table 
end proc 

स्थानीय अस्थायी तालिकाओं जब संग्रहीत प्रक्रिया है कि उन्हें बनाया से लौट नष्ट कर रहे हैं।

अपडेट 2014-10-14: स्थानीय टेम्पलेट टेबल का व्यवहार SQL सर्वर के समांतर डेटा वेयरहाउस संस्करण में भिन्न है। अस्थायी तालिकाओं को संग्रहीत प्रक्रिया से बाहर निकलने पर नहीं छोड़ा जाता है, और इसके बजाय शेष सत्र के लिए मौजूदा जारी रहता है। यह व्यवहार को मनाया:

select @@version 
Microsoft SQL Server 2012 - 10.0.5108.1 (X64) Jun 24 2014 20:17:02 Copyright (c) Microsoft Corporation Parallel Data Warehouse (64-bit) on Windows NT 6.2 <X64> (Build 9200:) 
1

आप मैन्युअल रूप से tempdb डेटाबेस में टेबल बना, तो आप और अधिक या कम एक ही प्रभाव प्राप्त । हालांकि, उन्हें मैन्युअल रूप से कम करने की आवश्यकता है, हालांकि, कम से कम पंक्तियों के बराबर नहीं है।

+0

मेरा वर्तमान ADO.NET कार्यान्वयन यह है कि जब मैं temp तालिका में रिकॉर्ड डालता हूं और जुड़ता हूं, तो मैं IDbConnection पर रोलबैक() करता हूं, ताकि वास्तव में पर्याप्त हो। आप कहते हैं कि तालिका हटाई नहीं जाएगी, लेकिन इसकी सामग्री के बारे में क्या? मैं सोच रहा हूं कि, यदि मैं वास्तव में लेनदेन नहीं कर रहा हूं, तो कोई अन्य सक्रिय कनेक्शन डेटा तक पहुंच सकता है –

+0

यह काम करेगा, लेकिन यह अविश्वसनीय रूप से अक्षम है। SQL सर्वर में रोलबैक बहुत ताला प्रवण और धीमी है, खासकर बड़े डेटा के लिए। सत्र-स्तरीय अस्थायी तालिकाओं का उपयोग करने के लिए बहुत अधिक कुशल या यदि आप वैश्विक तालिका होने पर जोर देते हैं, तो इसे पूरा करने के बाद इसे छोटा करने के लिए। –

1

यदि आप SQL सर्वर में एक वैश्विक टेम्पल तालिका (## तालिका) बनाते हैं तो यह 'लाइव' होगा और उस सत्र को बंद होने तक अन्य सत्रों के माध्यम से सुलभ हो जाएगा। इसके अतिरिक्त, जब तक मूल सत्र बंद नहीं हो जाता है, तब तक आप एक अलग सत्र के लिए उसी नाम के तहत उस वैश्विक टेम्पल तालिका को बनाने में सक्षम नहीं होंगे, आप पाएंगे कि तालिका पहले से मौजूद है। आपके उद्देश्य के लिए एक वैश्विक टेम्पलेट टेबल एक अच्छा समाधान नहीं होगा।

एक स्थानीय टेम्पल टेबल (#table) बहुत बेहतर होगा और जो आप करना चाहते हैं उसे प्राप्त करेंगे।

आशा इस मदद करता है

+0

एक वैश्विक अस्थायी तालिका के रिकॉर्ड केवल उन लेनदेन के भीतर सुलभ हैं जिन्हें वे बनाए गए थे? मैं प्रत्येक क्वेरी तालिका बनाने की जरूरत नहीं है। –

+0

नहीं, SQL सर्वर वैश्विक temp तालिकाओं (## table_name) में रिकॉर्ड सभी सत्रों के लिए दृश्यमान हैं। –

4

SQL सर्वर पर अस्थायी तालिकाओं डिफ़ॉल्ट रूप से स्थानीय कर रहे हैं। सत्र समाप्त होने के बाद तालिका गिरा दी जाएगी। आप की तरह एक स्क्रिप्ट को निष्पादित हैं:

create table #Foo (
     FooID int 
     ,FooCode1 varchar (20) 
) 

insert table #Foo (FooID, FooCode1) 
values (1001, 'X') 

insert table #Foo (FooID, FooCode1) 
values (1002, 'Y') 

select f.FooID 
     ,f.FooCode1 
     ,b.BarID 
     ,b.BarCode1 
    from #foo f 
    join bar b 
    on bar.FooID = f.FooID -- (or whatever predicate) 

क्वेरी केवल आप इस सत्र में #Foo में क्या डाला पर पंक्तियों में शामिल होने के वापस आ जाएगी। # फू सत्र के लिए स्थानीय है; आप नामस्थान टकराव के बारे में कोई चिंता नहीं होने के साथ अपने स्वयं के # फ़ू अस्थायी तालिका के साथ कई सत्र प्राप्त कर सकते हैं।जब सत्र बंद हो जाता है तो अस्थायी तालिका को त्याग दिया जाएगा। यदि आप लगातार डेटाबेस कनेक्शन (उदा। क्लाइंट-सर्वर डेस्कटॉप ऐप) का उपयोग कर रहे हैं तो आप इसके साथ समाप्त होने के बाद भी #Foo को स्पष्ट रूप से छोड़ सकते हैं।

+0

मैं एक आईडीबीकनेक्शन बनाता हूं और लेनदेन का प्रबंधन करता हूं (लगातार नहीं) और कनेक्शन बंद करें। जब कनेक्शन बंद हो जाता है, तो सत्र भी सही होता है? –

+0

हां, अगर आप कनेक्शन बंद करते हैं तो सत्र बंद हो जाएगा। – ConcernedOfTunbridgeWells

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