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?

bmw0128
sumber

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.

Bukan saya
sumber
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.

Akhilesh Kamate
sumber
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 []

Mian
sumber
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]') 
Tom Stickel
sumber
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
Joe Stefanelli
sumber
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 
Abhishek Jaiswal
sumber
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

Jaspreet Singh
sumber
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')
Muhammad Yaseen
sumber
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.

Sean Warren
sumber
2

klik kanan pada tabel dan klik tabel script sebagai pilih

masukkan deskripsi gambar di sini

Shimon Doodkin
sumber
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

Vijay S
sumber
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"')

Shadi Namrouti
sumber
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

Agung Panduan
sumber