2010-03-03 8 views
6

मैं एक स्क्रिप्ट लिख रहा हूं जो सर्वर के समूह के चारों ओर दौड़ना है और स्थानीय सर्वर सहित उनमें से डेटा का एक गुच्छा चुनना है। SQL को आवश्यक डेटा को चुनने के लिए आवश्यक बहुत जटिल है, इसलिए मैं एक विज्ञापन-प्रसार दृश्य लिख रहा हूं, और डेटा प्राप्त करने के लिए एक OPENQUERY कथन का उपयोग कर रहा हूं, इसलिए आखिरकार मैं इस तरह के एक बयान पर लूपिंग समाप्त करता हूं:स्थानीय सर्वर पर OPENQUERY का उपयोग क्यों खराब है?

exec('INSERT INTO tabl SELECT * FROM OPENQUERY(@Server, @AdHocView)') 

हालांकि, मैंने सुना है कि स्थानीय सर्वर पर OPENQUERY का उपयोग कर फेंक दिया गया है। क्या कोई बता सकता है कि क्यों?

+0

यह एक प्रशासक स्क्रिप्ट है, इसलिए मैं अनुमतियों के बारे में चिंतित नहीं हूं। मेरा प्रश्न, विशेष रूप से, क्या कोई चिंता है जब स्क्रिप्ट सर्वर की सूची में लूप हो जाती है और अपने सर्वर नाम में चलाती है? यह आम तौर पर एक त्रुटि फेंकता है, सर्वर डेटा एक्सेस के लिए कॉन्फ़िगर नहीं किया गया है, जिसे EXEC sp_serveroption 'लोकलसेवर', 'डेटा एक्सेस', TRUE – Dlongnecker

+0

चेक [लिंक किए गए सर्वर] (http://msdn.microsoft.com/en- हमें/पुस्तकालय/ms188279।एएसपीएक्स) – Andrey

उत्तर

6
  • हालांकि क्वेरी एकाधिक परिणाम सेट वापस कर सकती है, OPENQUERY केवल पहले ही लौटाता है।
  • OPENQUERY अपने तर्कों के लिए चर स्वीकार नहीं करता है।
  • OPENQUERY का उपयोग किसी लिंक किए गए सर्वर पर विस्तारित संग्रहीत प्रक्रियाओं को निष्पादित करने के लिए नहीं किया जा सकता है। हालांकि, एक विस्तारित संग्रहीत प्रक्रिया को चार-भाग वाले नाम का उपयोग करके एक लिंक किए गए सर्वर पर निष्पादित किया जा सकता है।
  • sp_addlinkedserver संग्रहीत प्रक्रिया एक ही स्क्रिप्ट के भीतर किया जाता है, दूरस्थ सर्वर पर उपयोग किए गए क्रेडेंशियल स्क्रिप्ट में, किसी को जो एक प्रति है करने के लिए कर रहे हैं hardcoded दिखाई

संदर्भ:

+0

मुझे दूसरे दिन 'OPENQUERY' का उपयोग करने का मौका मिला और महसूस हुआ कि आपका चौथा बिंदु गलत था; 'OPENQUERY' एक लिंक किए गए सर्वर पर चल रहा है, इसलिए कोई क्रेडेंशियल हार्ड-कोडेड नहीं है। आप 'ओपनरोसेट' के बारे में सोच रहे हैं। – Aaronaught

+0

@Aaronaught: यदि कोई लिंक किया गया सर्वर उदाहरण मौजूद है, तो OPENQUERY का उपयोग क्यों करें? यदि 'sp_addlinkedserver' संग्रहीत प्रक्रिया उसी स्क्रिप्ट के भीतर उपयोग की जाती है, तो मेरे बिंदु में योग्यता है। –

+1

ठीक है, चूंकि आपने पूछा, वास्तव में 'OPENQUERY': प्रदर्शन का उपयोग करने का एक कारण है। 'OPENQUERY' क्वेरी को दूरस्थ सर्वर पर संसाधित करने की अनुमति देता है, जबकि मानक 4-भाग नामकरण को सभी पंक्तियों को स्थानीय सर्वर पर कॉपी करना होता है, जो बड़े डेटा सेट के लिए बहुत खराब है। बेशक इसका उल्लेख आपके द्वारा उल्लिखित अन्य व्यापार-बंदों के खिलाफ किया जाना चाहिए। – Aaronaught

2

@OMG टट्टू के अलावा, यह केवल अनावश्यक है। जब आपको ऐसा करने की ज़रूरत नहीं है तो विज्ञापन-प्रसार क्वेरी और वितरित लेनदेन अर्थशास्त्र को पेश करने का कोई कारण नहीं है। जब आप OPENQUERY का उपयोग करते हैं तो आप गतिशील एसक्यूएल के सभी नकारात्मक पहलुओं को लेते हैं, जिसमें कम अनुमानित योजनाएं और सर्वर की निर्भरता को सटीक रूप से ट्रैक करने में असमर्थता शामिल है।

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

2

बस एक फॉलोअप।

ओपनक्वियर अच्छा है जब आपको संग्रहित प्रक्रियाओं से कुछ पंक्तियों की तुलना या कुशलतापूर्वक उपयोग करना होता है।

उदाहरण के लिए आप दो सर्वर से परिणाम (परीक्षण और रोलआउट सर्वर) की तुलना करने के लिए जब आप एसक्यूएल सर्वर से माइग्रेट हो, तो 2005 को एसक्यूएल सर्वर 2008 उदाहरण के लिए, तो आप निम्न क्वेरी कर सकते हैं:

select * into test_table from OpenQuery(testServer, 'exec testdb.dbo.test_sp'); 
select * into rollout_table from OpenQuery(rolloutServer, 'exec testdb.dbo.test_sp'); 

select * from test_table 
except 
select * from rollout_table; 

select * from rollout_table 
except 
select * from test_table; 

किसी भी विसंगति को देखने के लिए।

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