SQL Server'da iki farklı sunucudan veri seçme


363

SQL Server'daki iki farklı sunucudaki iki farklı veritabanından aynı sorgudaki verileri nasıl seçebilirim?


6
Eric ve Raging Bull'un cevapları çok kullanışlı. Bunu, 5 saatten 18 saate, 17 saniyeye kadar değişen süreler boyunca DEV'den PROD'ye kadar olan yığınlara veri kopyalamak için kullanabildim.
Chris Aldrich

@Eric, marjinal olarak belirsiz bir soruyu düzenlemek ve 170 tekrarlı bir soru yapmak için kudos :)
Eric Wu

Yanıtlar:


345

Aradığın şey Bağlantılı Sunucular. SSMS'de onlara Nesne Gezgini ağacında aşağıdaki konumdan ulaşabilirsiniz:

Server Objects-->Linked Servers

veya sp_addlinkedserver kullanabilirsiniz .

Yalnızca bir tane ayarlamanız gerekir. Bunu yaptıktan sonra, diğer sunucudaki bir tabloyu şöyle çağırabilirsiniz:

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

Sahibinin her zaman olmadığını unutmayın dbo, bu nedenle kullandığınız şema ile değiştirdiğinizden emin olun.


13
bağlı sunucular olmadan yapabilir miyiz?
Buhar

5
@Eric, SSMS'de Sunucu Nesneleri Nerede?
Tsahi Asher

9
@TsahiAsher - Bir sunucuya bağlandığınızda, Sunucu Nesneleri Nesne Gezgini ağacındaki bir klasördür.
Eric

2
Bilinmiyorsa, şemayı varsayılanı kullanmasını da ihmal edebilirsiniz. Örneğin [OtherServerName].[OtherDB]..[OtherTable], eğer biliniyorsa onu dahil etmek en iyisidir.
Tom Bowers

92

Bağlı Sunucu'yu kullanarak yapabilirsiniz.

Tipik olarak bağlı sunucular, Veritabanı Altyapısı'nın başka bir SQL Server örneğinde veya Oracle gibi başka bir veritabanı ürününde tablolar içeren bir Transact-SQL deyimi yürütmesini sağlamak üzere yapılandırılır. Microsoft Access ve Excel de dahil olmak üzere birçok türde OLE DB veri kaynağı bağlı sunucular olarak yapılandırılabilir.

Bağlı sunucular aşağıdaki avantajları sunar:

  • SQL Server dışından verilere erişebilme.
  • Kurum genelinde heterojen veri kaynakları üzerinde dağıtılmış sorgular, güncellemeler, komutlar ve işlemler düzenleme yeteneği.
  • Çeşitli veri kaynaklarını benzer şekilde ele alma becerisi.

Bağlı Sunucular hakkında daha fazla bilgi edinin .

Bağlantılı Sunucu oluşturmak için şu adımları izleyin:

  1. Sunucu Nesneleri -> Bağlantılı Sunucular -> Yeni Bağlantılı Sunucu

  2. Uzak Sunucu Adı sağlayın.

  3. Uzak Sunucu Türü'nü (SQL Server veya Diğer) seçin.

  4. Güvenlik -> Bu güvenlik bağlamı kullanılarak oluştur'u seçin ve uzak sunucunun oturum açma adı ve şifresini girin.

  5. Tamam tıklayın ve işiniz bitti !!

İşte bir bağlantılı sunucu oluşturmak için basit bir öğretici olduğunu.

VEYA

Sorgu kullanarak bağlantılı sunucu ekleyebilirsiniz.

Sözdizimi:

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

Sp_addlinkedserver hakkında daha fazla bilgi edinin .

Bağlantılı sunucuyu yalnızca bir kez oluşturmanız gerekir . Bağlantılı sunucu oluşturduktan sonra aşağıdaki gibi sorgulayabiliriz:

select * from LinkedServerName.DatabaseName.OwnerName.TableName

Not: sunucu adının ana makine adı / bağlantı noktası dışında bir şey olması için buraya bakın .
Richard

1
Bir ipucu, burada sp_addlinkedserver ile sorun yaşıyorsanız. İletişim kutusunda sunucuyu oluşturun - çalıştığından emin olun - ardından bağlantıyı sağ tıklayın ve komut dosyasını seçin [t bağlantılı sunucu AS create
Richard Housham

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

Bağlantılı Sunucuları kullanarak da bakabilirsiniz. Bağlı sunucular, DB2 platformları gibi başka veri kaynağı türleri de olabilir. Bu, SQL Server TSQL veya Sproc çağrısından DB2'ye erişmeye çalışmak için bir yöntemdir ...


2
bu yöntem her zaman işe yarayacak mı? başarısız olabileceği senaryolar nelerdir?
Buhar

3
Bunun envimde başarısız olduğunu doğruladı, hata addlinkedserver kullanmam gerektiğini söylüyor
gorlaz

1
Bu Bağlantılı Sunucu kullanmadan herkes için çalışıyor mu?
Doug S

test edildi ve hata alındı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 farklı veritabanında sorgulama yapmak dağıtılmış bir sorgudur. İşte bazı tekniklerin yanı sıra artıları ve eksileri:

  1. Bağlı sunucular: SQL Server çoğaltmasının sağladığından daha çeşitli veri kaynaklarına erişim sağlar
  2. Bağlı sunucular: Çoğaltmanın desteklemediği veya ad hoc erişim gerektiren veri kaynaklarına bağlanın
  3. Bağlı sunucular: OPENDATASOURCE veya OPENROWSET'ten daha iyi performans gösterin
  4. OPENDATASOURCE ve OPENROWSET işlevleri: Geçici olarak veri kaynaklarından veri almak için uygundur. OPENROWSET, aynı zamanda, fiddley olabilecek bir biçim dosyası gerektirebilecek / gerektirmeyebilecek TOPLU olanaklara sahiptir
  5. OPENQUERY : Değişkenleri desteklemez
  6. Hepsi T-SQL çözümleridir. Uygulaması ve kurulumu nispeten kolay
  7. Hepsi performans ve ölçeklenebilirliği etkileyebilecek kaynak ve hedef arasındaki bağlantıya bağlıdır

OPENQUERY hala OPENDATASOURCE gibi bir bağlantılı sunucu gerektirir
CJ

16

bunu dene:

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

Bunların hepsi iyi cevaplar, ama bu eksik ve kendi güçlü kullanımları var. Muhtemelen OP'nin istediği şeylere uymuyor, ama soru belirsizdi ve başkalarının burada yollarını bulabileceğini hissediyorum. Temel olarak aynı anda birden çok sunucuya karşı bir sorgu çalıştırmak için 1 pencere kullanabilirsiniz.

SSMS'de Kayıtlı Sunucular'ı açın ve Yerel Sunucu Grupları altında Yeni Sunucu Grubu oluşturun .

Bu grup altında sorgulamak istediğiniz her sunucu için Yeni Sunucu Kaydı oluşturun . DB adları farklıysa, özelliklerin her biri için bir varsayılan ayarladığınızdan emin olun.

Şimdi ilk adımda oluşturduğunuz Gruba geri dönün, sağ tıklayın ve Yeni Sorgu'yu seçin. Yeni bir sorgu penceresi açılır ve çalıştırdığınız herhangi bir sorgu gruptaki her sunucuda yürütülür. Sonuçlar, kaydın hangi sunucudan geldiğini gösteren fazladan sütun adıyla tek bir veri kümesinde sunulur. Durum çubuğunu kullanırsanız, sunucu adının birden çok adla değiştirildiğini göreceksiniz .


2
Bu, sorgunun tüm veritabanlarında aynı tabloları kullandığını varsayar. (Bu, sys.tables gibi standart tablolar için iyidir, ancak dbo.mycustomers gibi özel yapılmış tablolar için olası değildir)
Dennis Jaheruddin

"İki farklı veritabanından aynı sorgu" olduğu göz önüne alındığında, aynı tablolara sahip olma olasılığı yüksektir. Ancak evet, bu yöntemi rutin olarak çeşitli sunucularda bulunan bir üretim sistemi ve MSDB tablolarını sorgulamak için kullanıyorum.
Paul

Aslında gerçekten harika bir özellik. Dezavantajı, sorguyu iki kez yürüttüğü ve hepsini aynı anda birleştirdiği için sonuç kümesinin şeması eşleşmelidir. Sonuç kümesine KATILAMADIĞINIZ ve kümelerin ayrı ayrı değerlendirilmek üzere yapılandırılması gerekse bile, SQL'in içindeki sunuculara başvurabiliyorsanız harika olurdu.
Kross

1
@ Bir türlü yapabilirsin. Bir #output tablosu oluşturun, @@ SERVERNAME temelli bir mantık yapın ve verileri #output içine yerleştirin ve ardından bunu bir seçimle bitirin. Farklı bilgi / sütun bilgi düzeyine sahip SQL2000 ve SQL2008R2 makinelerinin bir karışımından Günlük bilgilerini sorgulamak için benzer bir şey yaptım, ancak @@ SUNUCUSU yerine bir sunucu sürümü değişkeni kullanıyordum.
Paul

9

Bir SQL_server 2008'i uzak bir sunucuda barındırılan bir SQL_server 2016'ya bağlamak için de aynı sorunu yaşadım. Diğer cevaplar benim için kolay olmadı. Tweaked çözümümü buraya yazıyorum çünkü başka biri için yararlı olabileceğini düşünüyorum.

Uzak IP db bağlantıları için genişletilmiş yanıt:

1.Adım: Sunucuları bağlayın

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_NAMEicat edilen bir isim nerede . Sorgularımızdan uzak sunucuya başvurmak için kullanacağız. aaa.bbb.ccc.dddSQLserver DB'nizi barındıran uzak sunucunun ip adresidir.

2. Adım: Sorgularınızı çalıştırın Örneğin:

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

...ve bu kadar!

Sözdizimi ayrıntıları: sp_addlinkedserver ve sp_addlinkedsrvlogin


4

Bir sunucuda diğer sunucuya Bağlantılı Sunucu tanımı oluşturdu (bunu yapmak için SA'ya ihtiyacınız var), sonra sadece 4 bölümlü adlandırma ile referans alın (bkz. BOL).


4

Sunucu 2008:

SSMS'de server1.DB1'e bağlıyken ve deneyin:

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

diğerleri belirtildiği gibi, eğer işe yaramazsa sunucu bağlı değildir çünkü.

Hatayı alıyorum:

Sys.servers içinde DB2 sunucusu bulunamadı. Doğru sunucu adının belirtildiğini doğrulayın. Gerekirse, sunucuyu sys.servers dosyasına eklemek için saklı yordamı sp_addlinkedserver yürütün.

Sunucuyu eklemek için:

başvuru: sp_addlinkedserver kullanarak sunucu eklemek için Bağlantı: [1]: sp_addlinkedserver kullanarak sunucu eklemek için

Sys.servers dosyasında ne olduğunu görmek için sorguyu yapman yeterli:

SELECT * FROM [sys].[servers]

3
 select * 
 from [ServerName(IP)].[DatabaseName].[dbo].[TableName]

2

@ Super9, veri sağlayıcı SQLOLEDB ile SQL Server Kimlik Doğrulaması kullanarak OPENDATASOURCE hakkında söyledi . Ben sadece burada bir tablo için bir kod parçacığı kod çalıştığı geçerli sever veritabanında ve başka bir sunucuda başka bir sunucuda gönderme '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')

yani böyle devam etmeli -

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

0

Bunun eski bir soru olduğunu biliyorum ama eşanlamlıları kullanıyorum. Sözde sorgu A veritabanı sunucusunda yürütülür ve A sunucusunda bulunmayan bir B veritabanı sunucusunda bir tablo arar. Sonra da eşanlamlı olarak B tablonuzu B sunucusundan çağıran bir veritabanına bakın. herhangi bir şema veya farklı veritabanı adları ekleyin, her zamanki gibi tablo adını arayın ve çalışacaktır.

Sunucuları, her tür eşanlamlı bağlantı olduğu için bağlamaya gerek yoktur.


1
O halde bu bağlamda "eşanlamlı" nedir?
Oskar Berggren

Başka bir veritabanındaki temel nesneye başvuran bir veritabanı nesnesidir. Daha fazla bilgi için burada: docs.microsoft.com/en-us/sql/relational-databases/synonyms/…
Niklas Henricson

Harika, bu özelliği bilmiyordum. Bununla birlikte, bağlantılı bir sunucuya ihtiyaç duymadıklarını da belirtiyorsunuz, ancak nasıl olduğunu göremiyorum. Eşanlamlıların kendisi sadece bir eşanlamlı gibi görünür ve kendisi herhangi bir özel uzaklaştırma yeteneği içermez. Docs.microsoft.com/en-us/sql/t-sql/statements/… adresindeki B örneğinde , eşanlamlıdan bahsetmeden önce bağlantılı bir sunucu oluştururlar.
Oskar Berggren

Doğru, veritabanlarının aynı sunucu ortamında olduğunu varsaydım. Tabii ki birbirlerinden uzaklarsa her zaman veritabanlarını bağlamanız gerekir. Veritabanı-veritabanı ilişkisi ile erişmenin başka bir yolu yoktur.
Niklas Henricson

0

Sunucu Nesneleri ---> bağlantılı sunucu ---> yeni bağlantılı sunucu

Bağlantılı sunucuda diğer sunucu için sunucu adı veya IP adresi yazın ve SQL Server'ı seçin.

Şimdi bağlı sonra kullanın

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

0

Bağlı sunucular eklemek için basitleştirilmiş çözüm

İlk sunucu

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

İkinci Giriş

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

Bağlı yerel db sorguları yürütmek

INSERT INTO Tbl (Col1, Col2, Col3)
SELECT Col1, Col2, Col3
FROM [ip,port\instancename].[linkedDBName].[linkedTblSchema].[linkedTblName]
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.