SQL Server Bağlantılı Sunucu Örnek Sorgusu


94

Management Studio'dayken, iki bağlantılı sunucu arasında bir sorgu çalıştırmaya / birleştirme yapmaya çalışıyorum. Bu, bağlantılı db sunucuları kullanan doğru bir sözdizimi mi:

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

Temel olarak, db sunucu adını db.table'a önceden veriyor musunuz?

Yanıtlar:


188

Biçim muhtemelen şöyle olmalıdır:

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

Örneğin: DatabaseServer1.db1.dbo.table1


Güncelleme : Bunun eski bir soru olduğunu ve aldığım cevabın doğru olduğunu biliyorum; ancak, bununla karşılaşan herhangi birinin birkaç şey bilmesi gerektiğini düşünüyorum.

Yani, bir birleştirme durumunda bağlantılı bir sunucuya karşı sorgulama yapılırken, bağlantılı sunucudan gelen TÜM tablo , birleştirme işlemini yapmak için sorgunun yürütüldüğü sunucuya muhtemelen indirilecektir. OP'ın durumda, her iki table1gelen DB1ve table1gelen DB2tahminen adlandırılan sorgu, yürütme sunucuya kendi bütünlükleri içerisinde aktarılacaktır DB3.

Büyük tablolarınız varsa, bu , yürütülmesi uzun süren bir işlemle sonuçlanabilir. Sonuçta, artık bellekten ve hatta disk aktarım hızlarından daha yavaş olan ağ trafiği hızları tarafından sınırlandırılmıştır.

Mümkünse, ihtiyacınız olan verileri geçici bir tabloya çekmek için yerel bir tabloya katılmadan uzak sunucuya karşı tek bir sorgu gerçekleştirin. Sonra bunun dışında sorgulayın.

Bu mümkün değilse, SQL sunucusunun tüm tabloyu yerel olarak yüklemesine neden olacak çeşitli şeylere bakmanız gerekir. Örneğin, GETDATE()hatta belirli birleşimleri kullanmak. Diğer performans öldürücüler, uygun hakları vermemeyi içerir.

Daha fazla bilgi için http://thomaslarock.com/2013/05/top-3-performance-killers-for-linked-server-queries/ adresine bakın .


11
veritabanı
sunucusu

4
@ bmw0128: Daha da iyisi, çift tırnak kullanın: Microsoft'un köşeli parantezlerinin aksine neredeyse her platform tarafından desteklenir.

2
Veritabanı sunucusu adında nokta varsa köşeli parantez veya çift tırnak kullanmanız gerekir.
David Brunow

4
Niteleyicilerden herhangi biri hakkında emin değilseniz, SSMS Nesne Gezgini'nde Bağlantılı Sunucudaki bir tabloya gidin, sağ tıklayın ve Komut Dosyası Tablosu olarak Seç, Seç ve Yeni Sorgu Düzenleyici Penceresi. Sonuçta ortaya çıkan SELECT deyimi, tablonun doğru, tam nitelikli yolunu içerecektir. Sybase ile çalışırken gizemli bir veritabanı niteleyicim vardı ve bu bana doğru adı verdi.
John Mo

Masanın tamamının transfer edileceğini söylemekte yanlış olduğunuzu düşünüyorum. Bu bilgiyi nereden aldığınıza dair biraz referans verebilir misiniz? Bağlantılı bir sunucuda 204 milyon satır (16 GB veri, 6,6 GB dizin) içeren bir tabloya katılmayı denedim ve verilerin önbelleğe alındığı için ikinci sorguda 7 ms olmak üzere satırların 5'ine bağlanmak 47 ms sürdü. Belki katılımınız bağlantılı masada bir masa taraması gerektiriyorsa, hepsini aktarması gerekir mi?
Jason Goemaat

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

Bu size yardımcı olabilir.


Olumlu oy verildi. Bu, MySQL'i MS SQL'e bağladığınızda çalışır.
Baz Guvenkaya

3
Başka bir deyişle, bu bir geçiş sorgusu oluşturmaktır. Sorgu ifadesinin sunucu için yerel SQL'de yazılması gerektiğini unutmayın. Oracle için sözdizimi, Teradata'dan farklı, SQL Server'dan farklı vb.
AxGryndr

11

Hala sorun bulursanız <server>.<database>.<schema>.<table>

Sunucu adını içine alın []


Dikkatli: Select kullanarak [] kullanarak bir oluşturma tablosu çalıştırdım ve Bağlantılı Sunucuda oluşturulmak yerine, tablo yerel olarakdbo.databaseserver1.db1.dbo.table1
biscuit314

9

Bu diğer cevaplarla sorun yaşayanlar için deneyinOPENQUERY

Misal:

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

SQL Server için çalışıyor
Tom Stickel

8

Referansın bir parçası olarak şema / sahibi (varsayılan olarak dbo) belirtmeniz gerekir. Ayrıca, daha yeni (ANSI-92) birleştirme stilinin kullanılması tercih edilir.

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

iç birleştirme sözdizimi örtük birleştirmelere tercih edilir mi?
bmw0128

2
@ bmw0128: Evet, birkaç nedenden dolayı. IMHO, en önemlisi, masalarınız olduğunda ve iki farklı yerde birleştiğinde yanlışlıkla bir çapraz ürün birleşimi yazmanın çok kolay olması.

4 noktalı parçaların bazı SQL-Server bağlantılı olmayan sunucular için ÇALIŞMAYACAĞINI unutmayın. Böyle bir hata ortaya çıkabilir ... "MyLinkedServer" bağlantılı sunucu için "MSDASQL" sağlayıcısı için geçersiz bir şema veya katalog belirtildi.
brewmanz

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

Aramanın doğru yolu budur. Sorguyu yürütmeden önce sunucuların bağlandığını doğruladığınızdan emin olun!

Bağlı sunucuları kontrol etmek için şunu arayın:

EXEC sys.sp_linkedservers 

Bu, bazı SQL-Server bağlantılı olmayan sunucular için ÇALIŞMAZ. Böyle bir hata oluştu ... Bağlı sunucu "MyLinkedServer" için "MSDASQL" sağlayıcısı için geçersiz bir şema veya katalog belirtildi.
brewmanz

4
select name from drsql01.test.dbo.employee
  • drslq01 servernmae - bağlantılı sunucu
  • test, veritabanı adıdır
  • dbo şema-varsayılan şema
  • çalışan tablo adıdır

Umarım bağlantılı sunucu için sorgunun nasıl yürütüleceğini anlamaya yardımcı olur


2

Bağlantılı sunucu durumunda genellikle doğrudan sorgular kullanılmamalıdır, çünkü yoğun olarak SQL sunucusunun geçici veritabanını kullanır. İlk adımda, veriler geçici DB'ye alınır ve ardından filtreleme gerçekleşir. Bununla ilgili birçok konu var. Open OPENQUERY kullanmak daha iyidir çünkü kaynak bağlantılı sunucuya SQL'i iletir ve sonra filtrelenmiş sonuçlar döndürür, örn.

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

Bu cevap bir veritabanı adı içermiyor
Chris Nevill

2
Bağlantılı sunucuyu oluştururken veritabanı bilgilerini sağladım. Ayrıntılı bilgi için aşağıdaki MSDN bağlantısını görebilirsiniz: msdn.microsoft.com/en-us/library/ff772782(v=sql.110).aspx
Muhammad Yaseen

Bağlı sunucum kimlik doğrulama gerektiriyorsa ve sadece PDO kullanarak PHP uygulamamdan sorgulamaya çalışıyorsam ne yapabilirim?
nekiala

Bu yaklaşımı kullanarak veritabanı 1'den bağlantılı sunucu üzerindeki veritabanına bir birleştirme işlemini nasıl gerçekleştirirsiniz?
eaglei22

2

Değeri ne olursa olsun, aşağıdaki sözdizimini en iyi şekilde çalıştığını buldum:

SEÇİN * [LINKED_SERVER] ... [TABLE]

Veritabanı adını kullanarak başkalarının önerilerini alamadım. Ayrıca, bu veri kaynağının şeması yoktur.


2

bir tabloya sağ tıklayın ve seçim olarak komut dosyası tablosuna tıklayın

görüntü açıklamasını buraya girin


OP'nin sorduğu bu değil
Fandango68

2
bu, bağlantılı bir tabloda seçme sorgusu için doğru sözdiziminin nasıl alınacağını gösterir. sonuç
seans'ın

1
@ShimonDoodkin, mükemmel bir örnek bana balığı verebilir, ama nasıl balık bana öğretmek değil
Amro

0

Sorguyu Takip Etmek en iyisidir.

Bu Sorguyu Deneyin:

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

MySQL'i MS SQL'e bağlamak çok yardımcı olur


0

PostgreSQL :

  1. Veri Kaynağı DSN'sinde bir veritabanı adı sağlamalısınız .
  2. Management Studio'yu Yönetici olarak çalıştırın
  3. DBName öğesini sorgudan çıkarmanız gerekir :

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


0

Openquery kullanarak link_server'daki tablodaki veri tipini bulmayı yaptım ve sonuçlar başarılı oldu.

SELECT * FROM OPENQUERY (LINKSERVERNAME, '
SELECT DATA_TYPE, COLUMN_NAME
FROM [DATABASENAME].INFORMATION_SCHEMA.COLUMNS
WHERE 
     TABLE_NAME  =''TABLENAME''
')

Benim için iş

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.