SQL Server'daki iki farklı sunucudaki iki farklı veritabanından aynı sorgudaki verileri nasıl seçebilirim?
SQL Server'daki iki farklı sunucudaki iki farklı veritabanından aynı sorgudaki verileri nasıl seçebilirim?
Yanıtlar:
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.
[OtherServerName].[OtherDB]..[OtherTable]
, eğer biliniyorsa onu dahil etmek en iyisidir.
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:
Bağlı Sunucular hakkında daha fazla bilgi edinin .
Sunucu Nesneleri -> Bağlantılı Sunucular -> Yeni Bağlantılı Sunucu
Uzak Sunucu Adı sağlayın.
Uzak Sunucu Türü'nü (SQL Server veya Diğer) seçin.
Güvenlik -> Bu güvenlik bağlamı kullanılarak oluştur'u seçin ve uzak sunucunun oturum açma adı ve şifresini girin.
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
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 ...
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.
2 farklı veritabanında sorgulama yapmak dağıtılmış bir sorgudur. İşte bazı tekniklerin yanı sıra artıları ve eksileri:
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
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 .
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_NAME
icat edilen bir isim nerede . Sorgularımızdan uzak sunucuya başvurmak için kullanacağız. aaa.bbb.ccc.ddd
SQLserver 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
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).
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]
@ 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
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.
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]