SQL सर्वर लिंक सर्वर उदाहरण क्वेरी


93

प्रबंधन स्टूडियो में रहते हुए, मैं दो जुड़े सर्वरों के बीच एक क्वेरी चलाने / जुड़ने की कोशिश कर रहा हूं। क्या यह लिंक किए गए db सर्वरों का उपयोग करके एक सही वाक्यविन्यास है:

select foo.id 
from databaseserver1.db1.table1 foo, 
     databaseserver2.db1.table1 bar 
where foo.name=bar.name

मूल रूप से, क्या आप db.table के लिए db सर्वर नाम को पहले से प्रस्तुत करते हैं?

जवाबों:


186

प्रारूप शायद होना चाहिए:

<server>.<database>.<schema>.<table>

उदाहरण के लिए: DatabaseServer1.db1.dbo.table1


अद्यतन : मुझे पता है कि यह एक पुराना प्रश्न है और मेरे पास जो उत्तर है वह सही है; हालाँकि, मुझे लगता है कि किसी और को इस पर ठोकर खाने के लिए कुछ चीजें पता होनी चाहिए।

अर्थात्, जब लिंक की गई स्थिति में किसी लिंक किए गए सर्वर के विरुद्ध क्वेरी करने के लिए, लिंक किए गए सर्वर से ENTIRE तालिका संभवत: उस सर्वर से डाउनलोड की जाएगी जिसे क्वेरी ऑपरेशन में शामिल होने के लिए निष्पादित कर रही है। ओपी के मामले में, दोनों table1से DB1और table1से DB2सर्वर क्वेरी, शायद नामित क्रियान्वित करने के लिए उनकी सम्पूर्णता में स्थानांतरित कर दिया जाएगा DB3

यदि आपके पास बड़ी टेबल हैं, तो इसके परिणामस्वरूप एक ऑपरेशन हो सकता है जो निष्पादित होने में लंबा समय लेता है। आखिरकार यह अब नेटवर्क ट्रैफिक गति से विवश है जो कि मेमोरी या डिस्क ट्रांसफर स्पीड की तुलना में कम परिमाण का आदेश है।

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

यदि यह संभव नहीं है, तो आपको उन विभिन्न चीजों पर ध्यान देने की आवश्यकता है जो SQL सर्वर को स्थानीय रूप से संपूर्ण तालिका को लोड करने का कारण बनेगी। उदाहरण के लिए GETDATE()या कुछ निश्चित योगों का उपयोग करना । अन्य प्रदर्शन हत्यारों में उचित अधिकार नहीं देना शामिल है।

अधिक जानकारी के लिए http://thomaslarock.com/2013/05/top-3-performance-killers-for-linked-server-queries/ देखें ।


11
यदि डेटाबेस के नाम में एक हाइफ़न है, तो इसे चौकोर कोष्ठक के साथ घेरने की आवश्यकता है
bmw0128

4
@ bmw0128: बेहतर अभी तक, दोहरे उद्धरण चिह्नों का उपयोग करें: यह Microsoft के वर्ग कोष्ठक के विपरीत, लगभग हर मंच द्वारा समर्थित है।

2
जब डेटाबेस सर्वर नाम की अवधि होती है, तो आपको वर्ग कोष्ठक या दोहरे उद्धरण चिह्नों का उपयोग करने की भी आवश्यकता होती है।
डेविड ब्रूनो

4
यदि आप किसी भी क्वालिफायर के बारे में अनिश्चित हैं, तो SSMS ऑब्जेक्ट एक्सप्लोरर, राइट-क्लिक और लिंक्ड इन, सेलेक्ट टू, और न्यू क्वेरी एडिटर विंडो के रूप में लिंक किए गए सर्वर में एक टेबल पर नीचे ड्रिल करें। परिणामी चयन कथन में तालिका में सही, पूरी तरह से योग्य पथ शामिल होगा। मेरे पास साइबेस के साथ काम करने में एक मिस्ट्री डेटाबेस क्वालिफायर था और इसने मुझे सही नाम दिया।
जॉन मो

मुझे लगता है कि आप यह कहने में गलत हैं कि पूरी तालिका स्थानांतरित कर दी जाएगी। क्या आप कुछ जानकारी प्रदान कर सकते हैं कि आपको यह जानकारी कहाँ से मिली? मैंने सिर्फ एक लिंक किए गए सर्वर पर 204 मिलियन पंक्तियों (16GB डेटा, 6.6GB इंडेक्स) के साथ एक तालिका के खिलाफ जुड़ने की कोशिश की और यह 47ms ले लिया 5 पंक्तियों से लिंक करने के लिए, दूसरी क्वेरी पर 7ms चूंकि डेटा संभवतः संचित थे। हो सकता है कि अगर आपके जुड़ने के लिए लिंक किए गए टेबल पर टेबल स्कैन की आवश्यकता हो तो उसे यह सब स्थानांतरित करना होगा?
जेसन गोएमाट

32
SELECT * FROM OPENQUERY([SERVER_NAME], 'SELECT * FROM DATABASE_NAME..TABLENAME')

यह आपकी मदद कर सकता है।


Upvoted। यह तब काम करता है जब आप MySQL को MS SQL से लिंक कर रहे हैं।
बाज़ गुवेक्कया

3
दूसरे शब्दों में, यह एक पास-थ्रू क्वेरी बना रहा है। ध्यान रखें कि क्वेरी स्टेटमेंट सर्वर के लिए मूल SQL में लिखा जाना चाहिए। ओरेकल के लिए सिंटैक्स SQL ​​सर्वर आदि से अलग
टेराडाटा

10

यदि आप अभी भी साथ समस्या पाते हैं <server>.<database>.<schema>.<table>

में सर्वर नाम संलग्न करें []


सावधान: मैंने चुनिंदा का उपयोग करके [] से एक तालिका बनाई, और लिंक्ड सर्वर पर बनाए जाने के बजाय, तालिका स्थानीय रूप से एक नाम के साथ बनाई गई थी जैसेdbo.databaseserver1.db1.dbo.table1
बिस्कुट 314


8

आपको संदर्भ के भाग के रूप में स्कीमा / स्वामी (डिफ़ॉल्ट रूप से dbo) को निर्दिष्ट करने की आवश्यकता है। इसके अलावा, नए (ANSI-92) शैली में शामिल होने का उपयोग करना बेहतर होगा।

select foo.id 
    from databaseserver1.db1.dbo.table1 foo
        inner join databaseserver2.db1.dbo.table1 bar 
            on foo.name = bar.name

भीतरी जोड़ वाक्यविन्यास निहित जोड़ के लिए बेहतर है?
bmw0128

2
@ bmw0128: हाँ, कई कारणों से। IMHO, सबसे महत्वपूर्ण यह है कि गलती से क्रॉस प्रोडक्ट जॉइन करने का तरीका बहुत आसान हो जाता है जब आपके पास अपनी टेबल होती है और दो अलग-अलग जगहों पर मिलती है।

ध्यान दें कि 4-डॉटेड-पार्ट्स कुछ गैर SQL- सर्वर से जुड़े सर्वर के लिए काम नहीं करता है। यह एक त्रुटि उठा सकता है जैसे ... लिंक किए गए सर्वर "MyLinkedServer" के लिए प्रदाता "MSDASQL" के लिए एक अवैध स्कीमा या कैटलॉग निर्दिष्ट किया गया था।
शराबखाने

6
select * from [Server].[database].[schema].[tablename] 

यह कॉल करने का सही तरीका है। यह सत्यापित करना सुनिश्चित करें कि क्वेरी निष्पादित करने से पहले सर्वर जुड़े हुए हैं!

लिंक किए गए सर्वर कॉल की जांच करने के लिए:

EXEC sys.sp_linkedservers 

यह कुछ गैर SQL- सर्वर से जुड़े सर्वर के लिए काम नहीं करता है। यह त्रुटि उठाता है ... लिंक किए गए सर्वर "MyLinkedServer" के लिए प्रदाता "MSDASQL" के लिए एक अवैध स्कीमा या कैटलॉग निर्दिष्ट किया गया था।
शराबखाने

4
select name from drsql01.test.dbo.employee
  • drslq01 servernmae - सिलेर्ड सीर है
  • परीक्षण डेटाबेस का नाम है
  • dbo स्कीमा है -डॉफ़्ट स्कीमा
  • कर्मचारी का नाम तालिका है

मुझे आशा है कि यह समझने में मदद करता है, कैसे जुड़े सर्वर के लिए क्वेरी निष्पादित करें


2

लिंक्ड सर्वर के मामले में आमतौर पर डायरेक्ट क्वेरी का उपयोग नहीं किया जाना चाहिए क्योंकि यह SQL सर्वर के अस्थायी डेटाबेस का भारी उपयोग करता है। पहले चरण के डेटा को अस्थायी डीबी में पुनर्प्राप्त किया जाता है फिर फ़िल्टरिंग होता है। इस बारे में कई सूत्र हैं। ओपन OPENQUERY का उपयोग करना बेहतर है क्योंकि यह SQL को स्रोत से जुड़े सर्वर से गुजरता है और फिर यह फ़िल्टर किए गए परिणाम उदा

SELECT *
FROM OPENQUERY(Linked_Server_Name , 'select * from TableName where ID = 500')

इस जवाब में एक डेटाबेस का नाम शामिल नहीं है
क्रिस नेविल

2
मैंने लिंक किए गए सर्वर को बनाते समय डेटाबेस की जानकारी प्रदान की है। विस्तार के लिए आप नीचे MSDN लिंक देख सकते हैं: msdn.microsoft.com/en-us/library/ff772782(v=sql.110).aspx
मुहम्मद यासीन

यदि मेरे लिंक किए गए सर्वर को प्रमाणीकरण की आवश्यकता है और मैं पीडीओ का उपयोग करके अपने PHP एप्लिकेशन से क्वेरी करने की कोशिश कर रहा हूं तो मैं क्या कर सकता हूं?
नेकियाल

आप इस दृष्टिकोण का उपयोग करके, लिंक किए गए सर्वर पर डेटाबेस 1 से डेटाबेस में शामिल होने का प्रदर्शन कैसे करेंगे?
ईगलिई

2

इसके लायक क्या है, मुझे सबसे अच्छा काम करने के लिए निम्नलिखित सिंटैक्स मिला:

चयन करें * से [LINKED_SERVER] ... [टेबल]

मैं डेटाबेस नाम का उपयोग करके दूसरों की सिफारिशों को काम नहीं कर सकता। इसके अतिरिक्त, इस डेटा स्रोत में कोई स्कीमा नहीं है।


2

एक तालिका पर राइट क्लिक करें और स्क्रिप्ट तालिका का चयन करें के रूप में क्लिक करें

यहां छवि विवरण दर्ज करें


ओपी ने जो नहीं पूछा, वह यह है कि
Fandango68

2
यह दिखाता है कि लिंक किए गए टेबल पर चयन क्वेरी के लिए सही सिंटैक्स कैसे प्राप्त करें। परिणाम सीन्स उत्तर की तरह है
शिमोन डूडकिन

1
@ShimonDoodkin, मुझे मछली न देने का एक उत्कृष्ट उदाहरण है, लेकिन मुझे मछली कैसे सिखाएं
Amro

0

निम्नलिखित प्रश्न सबसे अच्छा है।

इस प्रश्न को आज़माएँ:

SELECT * FROM OPENQUERY([LINKED_SERVER_NAME], 'SELECT * FROM [DATABASE_NAME].[SCHEMA].[TABLE_NAME]')

यह MySQL को MS SQL से लिंक करने में बहुत मदद करता है


0

PostgreSQL :

  1. आपको डेटा स्रोत DSN में एक डेटाबेस नाम प्रदान करना होगा ।
  2. व्यवस्थापक के रूप में प्रबंधन स्टूडियो चलाएँ
  3. आपको क्वेरी से DBName छोड़ना होगा :

    SELECT * FROM OPENQUERY([LinkedServer], 'select * from schema."tablename"')

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.