SQL सर्वर में दो अलग-अलग सर्वर से डेटा का चयन करना


363

मैं SQL सर्वर में दो अलग-अलग सर्वरों पर एक ही क्वेरी में डेटा का चयन कैसे कर सकता हूं?


6
एरिक और रेजिंग बुल के जवाब बहुत आसान हैं। मैं इसका उपयोग करने में सक्षम था DEV से PROD डेटा की बड़े पैमाने पर मात्रा को कॉपी करने के लिए 5 घंटे से लेकर 18 घंटे तक, 17 सेकंड तक की कटौती की गई।
क्रिस एल्डरिक

@ एरिक, एक मामूली अस्पष्ट प्रश्न को संपादित करने और इसे एक 170-प्रतिनिधि सवाल बनाने के लिए :)
एरिक वू

जवाबों:


345

क्या आप के लिए देख रहे हैं लिंक्ड सर्वर हैं। आप उन्हें ऑब्जेक्ट एक्सप्लोरर के पेड़ में निम्नलिखित स्थान से एसएसएमएस में प्राप्त कर सकते हैं:

Server Objects-->Linked Servers

या आप sp_addlinkedserver का उपयोग कर सकते हैं ।

आपको केवल एक सेट करना होगा। एक बार आपके पास ऐसा हो, तो आप दूसरे सर्वर पर एक टेबल कॉल कर सकते हैं जैसे:

select
    *
from
    LocalTable,
    [OtherServerName].[OtherDB].[dbo].[OtherTable]

ध्यान दें कि मालिक हमेशा नहीं होता है dbo, इसलिए जो भी स्कीमा आप उपयोग करते हैं, उसे प्रतिस्थापित करना सुनिश्चित करें।


13
क्या हम इसे लिंक किए गए सर्वर के बिना कर सकते हैं?
स्टीम

5
@ Eric, SSMS में सर्वर ऑब्जेक्ट्स कहाँ है?
त्सही अशर

9
@TsahiAsher - जब आप किसी सर्वर से कनेक्ट होते हैं, तो ऑब्जेक्ट ऑब्जेक्ट ट्री ट्री में ऑब्जेक्ट एक्सप्लोरर का एक फ़ोल्डर होता है।
एरिक

2
यदि ज्ञात नहीं है, तो आप डिफ़ॉल्ट का उपयोग करने के लिए स्कीमा को भी छोड़ सकते हैं। उदाहरण के लिए, [OtherServerName].[OtherDB]..[OtherTable]हालांकि यह सबसे अच्छा है अगर इसे जाना जाता है।
टॉम बोवर्स

92

आप इसे लिंक्ड सर्वर का उपयोग करके कर सकते हैं।

आमतौर पर लिंक किए गए सर्वर को Transact-SQL स्टेटमेंट को निष्पादित करने के लिए डेटाबेस इंजन को सक्षम करने के लिए कॉन्फ़िगर किया जाता है, जिसमें SQL सर्वर के किसी अन्य उदाहरण में टेबल या Oracle जैसे अन्य डेटाबेस उत्पाद शामिल होते हैं। कई प्रकार के OLE DB डेटा स्रोतों को लिंक्ड सर्वर के रूप में कॉन्फ़िगर किया जा सकता है, जिसमें Microsoft Access और Excel शामिल हैं।

लिंक किए गए सर्वर निम्नलिखित लाभ प्रदान करते हैं:

  • SQL सर्वर के बाहर से डेटा तक पहुँचने की क्षमता।
  • पूरे उद्यम में विषम डेटा स्रोतों पर वितरित प्रश्न, अपडेट, आदेश और लेनदेन जारी करने की क्षमता।
  • इसी तरह विविध डेटा स्रोतों को संबोधित करने की क्षमता।

लिंक्ड सर्वर के बारे में और पढ़ें ।

लिंक्ड सर्वर बनाने के लिए इन चरणों का पालन करें:

  1. सर्वर ऑब्जेक्ट्स -> लिंक्ड सर्वर -> न्यू लिंक्ड सर्वर

  2. दूरस्थ सर्वर नाम प्रदान करें।

  3. रिमोट सर्वर प्रकार (SQL सर्वर या अन्य) का चयन करें।

  4. सुरक्षा का चयन करें -> इस सुरक्षा संदर्भ का उपयोग करके बनाया जाए और रिमोट सर्वर का लॉगिन और पासवर्ड प्रदान करें।

  5. ठीक क्लिक करें और आप कर रहे हैं !!

लिंक सर्वर बनाने के लिए यहां एक सरल ट्यूटोरियल है।

या

आप क्वेरी का उपयोग करके लिंक किए गए सर्वर को जोड़ सकते हैं।

वाक्य - विन्यास:

sp_addlinkedserver [ @server= ] 'server' [ , [ @srvproduct= ] 'product_name' ] 
     [ , [ @provider= ] 'provider_name' ]
     [ , [ @datasrc= ] 'data_source' ] 
     [ , [ @location= ] 'location' ] 
     [ , [ @provstr= ] 'provider_string' ] 
     [ , [ @catalog= ] 'catalog' ] 

Sp_addlinkedserver के बारे में और पढ़ें ।

आपको केवल एक बार लिंक्ड सर्वर बनाना होगा । लिंक्ड सर्वर बनाने के बाद, हम इसे निम्नानुसार क्वेरी कर सकते हैं:

select * from LinkedServerName.DatabaseName.OwnerName.TableName

नोट: होस्टनाम / पोर्ट के अलावा सर्वर का नाम कैसे हो, इसके लिए यहां देखें ।
रिचर्ड

1
यदि आप sp_addlinkedserver से परेशान हैं, तो एक टिप का बिट। संवाद में सर्वर बनाएं - यह सुनिश्चित करें कि यह काम करता है - फिर कनेक्शन पर राइट क्लिक करें और
विभाजन का

25
SELECT
        *
FROM
        [SERVER2NAME].[THEDB].[THEOWNER].[THETABLE]

आप लिंक्ड सर्वर का उपयोग करके भी देख सकते हैं। लिंक्ड सर्वर अन्य प्रकार के डेटा स्रोत भी हो सकते हैं जैसे DB2 प्लेटफ़ॉर्म। यह SQL Server TSQL या Sproc कॉल से DB2 तक पहुँचने की कोशिश करने के लिए एक तरीका है ...


2
क्या यह विधि हर समय काम करेगी? ऐसे परिदृश्य क्या हैं जहाँ यह विफल हो सकता है?
स्टीम

3
मेरे env में यह विफल होने की पुष्टि हुई, त्रुटि कहती है कि मुझे Addlinkedserver का उपयोग करने की आवश्यकता है
gorlaz

1
लिंक्ड सर्वर का उपयोग किए बिना, यह किसी के लिए भी काम करता है?
डग एस

परीक्षण किया और प्राप्त त्रुटि हैCould not find server '88.208.229.164' in sys.servers. Verify that the correct server name was specified. If necessary, execute the stored procedure sp_addlinkedserver to add the server to sys.servers.
WhatsThePoint

22

2 अलग-अलग डेटाबेस में क्वेरी करना एक वितरित क्वेरी है। यहाँ कुछ तकनीकों और पेशेवरों और विपक्षों की सूची दी गई है:

  1. लिंक्ड सर्वर: SQL सर्वर प्रतिकृति प्रदान करता है की तुलना में डेटा स्रोतों की एक विस्तृत विविधता तक पहुंच प्रदान करता है
  2. लिंक्ड सर्वर: डेटा स्रोतों से जुड़ें जो प्रतिकृति समर्थन नहीं करते हैं या जिनके लिए तदर्थ पहुंच की आवश्यकता होती है
  3. लिंक्ड सर्वर: OPENDATASOURCE या OPENROWSET से बेहतर प्रदर्शन करते हैं
  4. OPENDATASOURCE और OPENROWSET फ़ंक्शंस: एक तदर्थ आधार पर डेटा स्रोतों से डेटा प्राप्त करने के लिए सुविधाजनक है। OPENROWSET में BULK सुविधाएं हैं, जो कि एक प्रारूप फ़ाइल की आवश्यकता हो सकती है / हो सकती है जो कि फ़िडली हो सकती है
  5. ओपन : चर का समर्थन नहीं करता
  6. सभी टी-एसक्यूएल समाधान हैं। लागू करने और स्थापित करने के लिए अपेक्षाकृत आसान है
  7. सभी स्रोत और गंतव्य के बीच संबंध पर निर्भर हैं जो प्रदर्शन और स्केलेबिलिटी को प्रभावित कर सकता है

OPENQUERY को अभी भी एक लिंक किए गए सर्वर की आवश्यकता है जहाँ OPENDATASOURCE नहीं है
CJ

16

इसे इस्तेमाल करे:

SELECT * FROM OPENROWSET('SQLNCLI', 'Server=YOUR SERVER;Trusted_Connection=yes;','SELECT * FROM Table1') AS a
UNION
SELECT * FROM OPENROWSET('SQLNCLI', 'Server=ANOTHER SERVER;Trusted_Connection=yes;','SELECT * FROM Table1') AS a

16

ये सभी ठीक उत्तर हैं, लेकिन यह गायब है और इसका अपना शक्तिशाली उपयोग है। संभवतः यह ठीक नहीं है कि ओपी क्या चाहता था, लेकिन सवाल अस्पष्ट था और मुझे लगता है कि अन्य लोग यहां अपना रास्ता खोज सकते हैं। मूल रूप से आप एक साथ कई सर्वरों के खिलाफ क्वेरी चलाने के लिए 1 विंडो का उपयोग कर सकते हैं, यहां बताया गया है:

SSMS में पंजीकृत सर्वर खोलें और स्थानीय सर्वर समूहों के तहत एक नया सर्वर समूह बनाएँ ।

इस समूह के तहत आप जिस भी सर्वर से क्वेरी करना चाहते हैं उसके लिए नया सर्वर पंजीकरण बनाएं । यदि DB नाम अलग-अलग हों तो प्रॉपर्टी में प्रत्येक के लिए डिफ़ॉल्ट सेट करना सुनिश्चित करें।

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


2
ऐसा लगता है कि क्वेरी सभी डेटाबेस पर समान तालिकाओं का उपयोग करती है। (जो sys.tables जैसी मानक तालिकाओं के लिए ठीक है, लेकिन dbo.mycustomers की तरह कस्टम मेड टेबल के लिए संभव नहीं है)
डेनिस जहरुद्दीन

यह देखते हुए कि "दो अलग-अलग डेटाबेस से एक ही क्वेरी" एक ही तालिकाओं के होने की अत्यधिक संभावना है। लेकिन हाँ, मैं इस विधि का उपयोग कई सर्वरों पर निर्मित उत्पादन प्रणाली और MSDB तालिकाओं के क्वेरी के लिए करता हूँ।
पॉल

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

1
@ सकल की तरह आप कर सकते हैं। #Output तालिका बनाएं, @@ SERVERNAME पर आधारित तर्क करें और डेटा को #output में पॉप्युलेट करें और फिर उस पर चयन करें। मैंने SQL2000 और SQL2008R2 मशीनों के मिश्रण से लॉग जानकारी को क्वेरी करने के लिए एक समान काम किया था जिसमें विभिन्न स्तरों / सूचनाओं के कॉलम थे, लेकिन @@ SERVERNAME के ​​बजाय मैं एक सर्वर संस्करण चर का उपयोग कर रहा था।
पॉल

9

एक SQL सर्वर को 2008 में दूरस्थ सर्वर में होस्ट किए गए SQL_server 2016 से कनेक्ट करने के लिए मेरे पास एक ही समस्या थी। अन्य उत्तरों ने मेरे लिए सीधा काम नहीं किया। मैं अपना सुव्यवस्थित समाधान यहां लिखता हूं क्योंकि मुझे लगता है कि यह किसी और के लिए उपयोगी हो सकता है।

दूरस्थ आईपी डीबी कनेक्शन के लिए एक विस्तारित जवाब:

चरण 1: लिंक सर्वर

EXEC sp_addlinkedserver @server='SRV_NAME',
   @srvproduct=N'',
   @provider=N'SQLNCLI',   
   @datasrc=N'aaa.bbb.ccc.ddd';

EXEC sp_addlinkedsrvlogin 'SRV_NAME', 'false', NULL, 'your_remote_db_login_user', 'your_remote_db_login_password'

... SRV_NAMEएक आविष्कृत नाम कहां है। हम अपने प्रश्नों से दूरस्थ सर्वर को संदर्भित करने के लिए इसका उपयोग करेंगे। aaa.bbb.ccc.dddआपके SQLserver DB की मेजबानी करने वाले दूरस्थ सर्वर का आईपी पता है।

चरण 2: उदाहरण के लिए अपने प्रश्नों को चलाएं :

SELECT * FROM [SRV_NAME].your_remote_db_name.dbo.your_table

...और बस!

सिंटैक्स विवरण: sp_addlinkedserver और sp_addlinkedsrvlogin


4

एक सर्वर से दूसरे सर्वर में एक लिंक्ड सर्वर परिभाषा बनाई गई (आपको ऐसा करने के लिए एसए की आवश्यकता है), फिर उन्हें केवल 4-पार्ट नामकरण (बीओएल देखें) के साथ संदर्भ दें।


4

सर्वर 2008:

जब SSMS server1.DB1 से जुड़ा हो और प्रयास करें:

SELECT  * FROM
[server2].[DB2].[dbo].[table1]

जैसा कि दूसरों ने उल्लेख किया है, अगर यह काम नहीं करता है क्योंकि सर्वर लिंक नहीं है।

मुझे त्रुटि मिलती है:

Sys.servers में सर्वर DB2 नहीं मिल सका। सत्यापित करें कि सही सर्वर नाम निर्दिष्ट किया गया था। यदि आवश्यक हो, तो sys.servers में सर्वर जोड़ने के लिए संग्रहीत कार्यविधि sp_addlinkedserver निष्पादित करें।

सर्वर जोड़ने के लिए:

संदर्भ: sp_addlinkedserver लिंक का उपयोग करके सर्वर जोड़ने के लिए: [1]: sp_addlinkedserver का उपयोग करके सर्वर जोड़ने के लिए

यह देखने के लिए कि आपके sys.servers में क्या है, बस इसे क्वेरी करें:

SELECT * FROM [sys].[servers]


2

जैसा कि @ Super9 ने डेटा प्रदाता SQLOLEDB के साथ SQL सर्वर प्रमाणीकरण का उपयोग करते हुए OPENDATASOURCE के बारे में बताया । मैं यहाँ सिर्फ एक टेबल स्निपेट पोस्ट कर रहा हूँ, जो कि वर्तमान गंभीर डेटाबेस में है जहाँ कोड चल रहा है और दूसरे सर्वर में दूसरा '192.166.41.123'

SELECT top 2 * from dbo.tblHamdoonSoft  tbl1 inner JOIN  
OpenDataSource('SQLOLEDB','Data Source=192.166.41.123;User ID=sa;Password=hamdoonsoft')
.[TestDatabase].[dbo].[tblHamdoonSoft1] tbl2 on tbl1.id = tbl2.id

0
sp_addlinkedserver('servername')

तो इसके इस तरह जाना चाहिए -

select * from table1
unionall
select * from [server1].[database].[dbo].[table1]

0

मुझे पता है कि यह एक पुराना प्रश्न है लेकिन मैं समानार्थक शब्द का उपयोग करता हूं। माना जाता है कि डेटाबेस डेटाबेस A के भीतर क्वेरी को निष्पादित किया जाता है, और एक डेटाबेस सर्वर B में एक तालिका की तलाश करता है, जो सर्वर A पर मौजूद नहीं है। तब A डेटाबेस पर एक समानार्थी शब्द जो सर्वर बी से आपकी तालिका को कॉल करता है, आपकी क्वेरी के पास नहीं है। किसी भी स्कीमा, या अलग-अलग डेटाबेस नाम शामिल करें, बस सामान्य रूप से तालिका नाम को कॉल करें और यह काम करेगा।

सर्वर को लिंक करने की कोई आवश्यकता नहीं है क्योंकि प्रति शब्द पर्यायवाची लिंक की तरह हैं।


1
अब इस संदर्भ में "पर्यायवाची" क्या है?
Oskar Berggren

यह एक डेटाबेस ऑब्जेक्ट है जो किसी अन्य डेटाबेस में बेस ऑब्जेक्ट को संदर्भित करता है। यहाँ अधिक जानकारी: docs.microsoft.com/en-us/sql/relational-dat डेटाबेस
निकलेस हैट्रिक्स 20

कूल, मुझे उस सुविधा के बारे में नहीं पता था। हालाँकि, आप यह भी कहते हैं कि वे एक लिंक किए गए सर्वर की आवश्यकता से बचते हैं, लेकिन मैं यह देखने में असफल हूँ कि कैसे। समानार्थी शब्द केवल एक पर्यायवाची शब्द प्रतीत होते हैं, न कि स्वयं में कोई विशिष्ट रीमोटिंग क्षमता होती है। उदाहरण B में docs.microsoft.com/en-us/sql/t-sql/statements/… पर , वे इसे एक पर्याय से संदर्भित करने से पहले एक लिंक किया हुआ सर्वर बनाते हैं।
ओस्कर बर्गग्रेन

सच है, मैंने मान लिया कि डेटाबेस एक ही सर्वर वातावरण में हैं। यदि आप एक दूसरे से दूरस्थ हैं, तो निश्चित रूप से आपको डेटाबेस को लिंक करना होगा। डेटाबेस-से-डेटाबेस संबंध तक पहुंचने का कोई अन्य तरीका नहीं है।
निकल्स हेनट्रिक्स

0

सर्वर ऑब्जेक्ट्स ---> लिंक्ड सर्वर ---> नया लिंक्ड सर्वर

लिंक किए गए सर्वर में अन्य सर्वर के लिए सर्वर का नाम या आईपी पता लिखें और SQL सर्वर चुनें सुरक्षा में चयन करें (इस सुरक्षा संदर्भ का उपयोग करके बनाया जाए) अन्य सर्वर के लिए लॉगिन और पासवर्ड लिखें

अब जुड़ा है तो उपयोग करें

Select * from [server name or ip addresses ].databasename.dbo.tblname

0

लिंक किए गए सर्वर को जोड़ने के लिए सरलीकृत समाधान

पहला सर्वर

EXEC sp_addlinkedserver @server='ip,port\instancename'

दूसरा लॉगिन

EXEC sp_addlinkedsrvlogin 'ip,port\instancename', 'false', NULL, 'remote_db_loginname', 'remote_db_pass'

स्थानीय db से जुड़े प्रश्नों को निष्पादित करें

INSERT INTO Tbl (Col1, Col2, Col3)
SELECT Col1, Col2, Col3
FROM [ip,port\instancename].[linkedDBName].[linkedTblSchema].[linkedTblName]
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.