2010-02-05 12 views
7

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

यह दूरस्थ सर्वर पर बनाई जाने वाली अस्थायी तालिका मजबूर करने के लिए संभव है? मान लें कि मेरे पास अपनी वास्तविक (स्थायी) टेबल बनाने के लिए पर्याप्त विशेषाधिकार नहीं हैं।

उत्तर

2

यह सीधे किसी लिंक किए गए दूरस्थ सर्वर पर अस्थायी टेबल बनाने के लिए संभव नहीं है। वास्तव में आप किसी लिंक किए गए सर्वर के खिलाफ किसी भी डीडीएल का उपयोग नहीं कर सकते हैं।

दिशा निर्देशों और जुड़ा हुआ सर्वर का उपयोग कर की सीमाओं के बारे में अधिक जानकारी के लिए देखें:

Guidelines for Using Distributed Queries (SQL 2008 Books Online)

एक काम के आसपास (और मेरे सिर के ऊपर से, और यह केवल यदि आप काम करेंगे रिमोट सर्वर पर अनुमतियां थीं) आप:

  • रिमोट सर्वर पर एक संग्रहित प्रक्रिया है जो एक नाम आधार के साथ एक सतत तालिका बनायेगी एक में पैरामीटर पर घ
  • दूरस्थ संग्रहीत प्रक्रिया फिर एक क्वेरी चलाने होगा इस तालिका में परिणाम सम्मिलित
  • तब आप उस मेज के खिलाफ स्थानीय स्तर पर क्वेरी के प्रदर्शन में कोई किसी भी स्थानीय तालिकाओं के लिए मिलती है आवश्यक
  • कॉल पर एक और संग्रहीत प्रक्रिया रिमोट सर्वर को रिमोट टेबल ड्रॉप करने के लिए

आदर्श नहीं है, लेकिन एक संभावित काम है।

4

यह एसक्यूएल 2005 SP3 मेरी वातावरण में एसक्यूएल 2005 SP3 से जुड़ा हुआ से काम करता है। हालांकि यदि आप tempdb का निरीक्षण करते हैं तो आप पाएंगे कि तालिका वास्तव में स्थानीय उदाहरण पर है और दूरस्थ उदाहरण नहीं है। मैंने इसे अन्य मंचों पर एक प्रस्ताव के रूप में देखा है और आपको इससे दूर ले जाना चाहता था।

create table SecondServer.#doll 
(
    name varchar(128) 
) 
GO 
insert SecondServer.#Doll 
select name from sys.objects where type = 'u' 


select * from SecondServer.#Doll 
1

अगर स्मृति एक मुद्दे के ज्यादा नहीं है, आप भी तालिका चर अस्थायी तालिकाओं के लिए एक विकल्प के रूप में उपयोग कर सकते हैं। यह एक लिंक्ड सर्वर के खिलाफ अस्थायी डेटा भंडारण की आवश्यकता के साथ संग्रहीत प्रक्रिया चलाते समय मेरे लिए काम करता है।

और जानकारी: जैसे तालिका चर और तालिका वैरिएबल का उपयोग कर की खामियों सहित अस्थायी टेबल, की this comparison। लेकिन यह केवल कनेक्शन की अवधि के लिए रहता है

+0

इस को दोष यह है कि, जहाँ तक मुझे पता है, आप तालिका चर पर अनुक्रमित नहीं बना सकते। (मैं 2 साल देर हो रही है, मुझे पता है ...) – alfoks

+2

ऐसा लगता है कि आप [तालिका चर पर अनुक्रमणिका बनाने] कर सकते हैं (http://sqlserverplanet.com/tsql/create-index-on-table-variable)। (है कि या तो यह नहीं पता था!) ​​ – Josien

+0

वाह! साझा करने के लिए धन्यवाद। मैं भविष्य में इसे ध्यान में होगा। – alfoks

2

हाँ आप कर सकते हैं। आपको एक्स्ट्राइट एटी सिंटैक्स का उपयोग करने की आवश्यकता है;

EXECUTE('SELECT * INTO ##example FROM sys.objects; WAITFOR DELAY ''00:01:00''') AT [SERVER2] 

SERVER2 पर निम्नलिखित कार्य करेगा (1 मिनट के लिए);

SELECT * FROM ##example 

लेकिन यह स्थानीय सर्वर पर काम नहीं करेगा। संयोग से यदि आप दूसरे सर्वर पर लेनदेन खोलते हैं जो ## उदाहरण का उपयोग करता है तो ऑब्जेक्ट तब तक रहता है जब तक लेनदेन बंद नहीं होता है। यह पूरा करने से पहले सर्वर पर निर्माण कथन भी रोकता है। यानी सर्वर 2 रन पर और सर्वर 1 पर लेनदेन अनिश्चित रूप से जारी रहेगा।

BEGIN TRAN 
SELECT * FROM ##example WITH (TABLOCKX) 

यह व्यावहारिक उपयोग की तुलना में अधिक अकादमिक है!

1

मैं पार्टी के लिए 2 साल देर से कर रहा हूँ, लेकिन आप इस का उपयोग कर sp_executeSQL और यह एक गतिशील क्वेरी खिला तालिका दूर से बनाने के लिए पूरा कर सकते हैं।

Exec RemoteServer.RemoteDatabase.RemoteSchema.SP_ExecuteSQL N'Create Table here'

इस दूरदराज के स्थान पर अस्थायी तालिका बनाने पर अमल होगा ..

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