Permintaan Contoh SQL Server Linked Server


94

Saat berada di Studio Manajemen, saya mencoba menjalankan kueri / melakukan gabungan antara dua server terkait. Apakah ini sintaks yang benar menggunakan server db tertaut:

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

Pada dasarnya, apakah Anda baru saja mengawali nama server db ke db.table?

Jawaban:


188

Formatnya mungkin:

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

Misalnya: DatabaseServer1.db1.dbo.table1


Pembaruan : Saya tahu ini adalah pertanyaan lama dan jawaban yang saya miliki benar; Namun, saya pikir orang lain yang tersandung pada hal ini harus mengetahui beberapa hal.

Yaitu, saat melakukan kueri terhadap server tertaut dalam situasi gabungan, SELURUH tabel dari server tertaut kemungkinan akan diunduh ke server yang menjalankan kueri untuk melakukan operasi gabungan. Dalam kasus OP, baik table1dari DB1dan table1dari DB2akan ditransfer secara keseluruhan ke server yang menjalankan kueri, mungkin bernama DB3.

Jika Anda memiliki tabel yang besar, ini dapat mengakibatkan operasi yang membutuhkan waktu lama untuk dijalankan. Lagipula sekarang ini dibatasi oleh kecepatan lalu lintas jaringan yang besarnya lebih lambat daripada kecepatan transfer memori atau bahkan disk.

Jika memungkinkan, lakukan satu kueri terhadap server jarak jauh, tanpa bergabung ke tabel lokal, untuk menarik data yang Anda perlukan ke tabel temp. Kemudian tanya dari itu.

Jika itu tidak memungkinkan maka Anda perlu melihat berbagai hal yang akan menyebabkan SQL server harus memuat seluruh tabel secara lokal. Misalnya menggunakan GETDATE()atau bahkan gabungan tertentu. Pembunuh kinerja lainnya termasuk tidak memberikan hak yang sesuai.

Lihat http://thomaslarock.com/2013/05/top-3-performance-killers-for-linked-server-queries/ untuk beberapa info lebih lanjut.


11
jika nama server database memiliki tanda hubung, perlu mengelilinginya dengan tanda kurung siku
bmw0128

4
@ bmw0128: Lebih baik lagi, gunakan tanda kutip ganda: ini didukung oleh hampir semua platform, tidak seperti tanda kurung siku Microsoft.

2
Anda juga perlu menggunakan tanda kurung siku atau tanda kutip ganda ketika nama server database memiliki titik di dalamnya.
David Brunow

4
Jika Anda tidak yakin tentang salah satu kualifikasi, telusuri ke tabel di Server Tertaut di SSMS Object Explorer, klik kanan, dan Tabel Skrip sebagai, PILIH Ke, dan Jendela Editor Kueri Baru. Pernyataan SELECT yang dihasilkan akan menyertakan jalur yang benar dan memenuhi syarat ke tabel. Saya memiliki kualifikasi database misteri dalam bekerja dengan Sybase dan ini memberi saya nama yang benar.
John Mo

Saya pikir Anda salah dalam mengatakan bahwa seluruh tabel akan ditransfer. Dapatkah Anda memberikan referensi tentang dari mana Anda mendapatkan informasi tersebut? Saya baru saja mencoba bergabung dengan tabel dengan 204 juta baris (data 16 GB, indeks 6,6 GB) pada server yang ditautkan dan butuh 47 md untuk ditautkan ke 5 baris, 7 md pada kueri kedua karena datanya mungkin di-cache. Mungkin jika gabungan Anda memerlukan pemindaian tabel pada tabel tertaut, itu harus mentransfer semuanya?
Jason Goemaat

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

Ini dapat membantu Anda.


Suara positif. Ini berfungsi saat Anda menautkan MySQL ke MS SQL.
Baz Guvenkaya

3
Dengan kata lain, ini membuat kueri kirim langsung. Perlu diingat bahwa pernyataan kueri harus ditulis dalam SQL asli untuk server. Sintaks untuk Oracle berbeda dari Teradata yang berbeda dari SQL Server dll.
AxGryndr

11

Jika Anda masih menemukan masalah dengan <server>.<database>.<schema>.<table>

Lampirkan nama server di []


Hati-hati: Saya mengeksekusi buat tabel dari pilih menggunakan [], dan alih-alih dibuat di Server Tertaut, tabel dibuat secara lokal dengan nama sepertidbo.databaseserver1.db1.dbo.table1
biscuit314

9

Bagi mereka yang mengalami kesulitan dengan jawaban lain ini , cobalahOPENQUERY

Contoh:

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

Bekerja untuk SQL Server
Tom Stickel

8

Anda perlu menentukan skema / pemilik (dbo secara default) sebagai bagian dari referensi. Selain itu, akan lebih baik jika menggunakan gaya gabungan (ANSI-92) yang lebih baru.

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

sintaks gabungan dalam lebih disukai daripada gabungan implisit?
bmw0128

2
@ bmw0128: Ya, karena beberapa alasan. IMHO, yang paling penting adalah terlalu mudah untuk secara tidak sengaja menulis gabungan produk silang ketika Anda memiliki tabel dan bergabung di dua tempat yang berbeda.

Perhatikan bahwa 4-titik-bagian TIDAK BEKERJA untuk beberapa server tertaut non-SQL-Server. Itu dapat menimbulkan kesalahan seperti ... Skema atau katalog yang tidak valid ditentukan untuk penyedia "MSDASQL" untuk server tertaut "MyLinkedServer".
brewmanz

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

Ini adalah cara yang benar untuk menelepon. Pastikan untuk memverifikasi bahwa server terhubung sebelum menjalankan kueri!

Untuk memeriksa panggilan server tertaut:

EXEC sys.sp_linkedservers 

Ini TIDAK BEKERJA untuk beberapa server terkait non-SQL-Server. Ini menimbulkan kesalahan seperti ... Skema atau katalog yang tidak valid ditentukan untuk penyedia "MSDASQL" untuk server tertaut "MyLinkedServer".
brewmanz

4
select name from drsql01.test.dbo.employee
  • drslq01 adalah servernmae --linked serer
  • tes adalah nama database
  • dbo adalah skema-skema default
  • karyawan adalah nama tabel

Saya harap ini membantu untuk memahami, cara menjalankan kueri untuk server yang ditautkan


2

Biasanya kueri langsung tidak boleh digunakan dalam kasus server yang ditautkan karena sangat menggunakan database temp dari SQL server. Pada langkah pertama data diambil ke DB temp kemudian terjadi pemfilteran. Ada banyak utas tentang ini. Lebih baik menggunakan OPENQUERY terbuka karena meneruskan SQL ke server tertaut sumber dan kemudian mengembalikan hasil yang disaring misalnya

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

Jawaban ini tidak menyertakan nama database
Chris Nevill

2
Saya telah memberikan informasi database saat membuat server tertaut. Untuk detailnya Anda dapat melihat tautan MSDN di bawah ini: msdn.microsoft.com/en-us/library/ff772782(v=sql.110).aspx
Muhammad Yaseen

Apa yang dapat saya lakukan jika server tertaut saya memerlukan otentikasi dan saya hanya mencoba melakukan kueri dari aplikasi PHP saya menggunakan PDO?
nekiala

Bagaimana Anda melakukan gabungan dari database 1, ke database di server tertaut, menggunakan pendekatan ini?
eaglei22

2

Untuk apa nilainya, saya menemukan sintaks berikut untuk bekerja paling baik:

PILIH * DARI [LINKED_SERVER] ... [TABLE]

Saya tidak bisa mendapatkan rekomendasi orang lain untuk bekerja, menggunakan nama database. Selain itu, sumber data ini tidak memiliki skema.


2

klik kanan pada tabel dan klik tabel script sebagai pilih

masukkan deskripsi gambar di sini


Bukan itu yang diminta OP
Fandango68

2
ini menunjukkan cara mendapatkan sintaks yang benar untuk kueri pemilihan pada tabel tertaut. hasilnya seperti jawaban seans
Shimon Doodkin

1
@ShimonDoodkin, contoh bagus dari jangan beri saya ikan, tapi ajari saya cara memancing
Amro

0

Kueri Mengikuti adalah yang terbaik.

Coba Query ini:

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

Sangat membantu untuk menghubungkan MySQL ke MS SQL


0

PostgreSQL :

  1. Anda harus memberikan nama database di DSN Sumber Data .
  2. Jalankan Studio Manajemen sebagai Administrator
  3. Anda harus menghilangkan DBName dari query :

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


0

Saya telah melakukan untuk mengetahui tipe data pada tabel di link_server menggunakan openquery dan hasilnya berhasil.

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

Ini berhasil untuk saya

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.