Bagaimana saya bisa memilih data dalam kueri yang sama dari dua database berbeda yang ada di dua server berbeda di SQL Server?
Bagaimana saya bisa memilih data dalam kueri yang sama dari dua database berbeda yang ada di dua server berbeda di SQL Server?
Jawaban:
Apa yang Anda cari adalah Server Tertaut. Anda bisa mendapatkannya di SSMS dari lokasi berikut di bagan Object Explorer:
Server Objects-->Linked Servers
atau Anda dapat menggunakan sp_addlinkedserver .
Anda hanya perlu mengatur satu. Setelah memilikinya, Anda dapat memanggil tabel di server lain seperti:
select
*
from
LocalTable,
[OtherServerName].[OtherDB].[dbo].[OtherTable]
Perhatikan bahwa pemiliknya tidak selalu dbo
, jadi pastikan untuk menggantinya dengan skema apa pun yang Anda gunakan.
[OtherServerName].[OtherDB]..[OtherTable]
Namun yang terbaik adalah memasukkannya jika diketahui.
Anda dapat melakukannya menggunakan Linked Server.
Server yang tertaut secara tipikal dikonfigurasikan untuk mengaktifkan Database Engine untuk mengeksekusi pernyataan Transact-SQL yang menyertakan tabel dalam contoh lain dari SQL Server, atau produk database lain seperti Oracle. Banyak jenis sumber data OLE DB dapat dikonfigurasi sebagai server yang ditautkan, termasuk Microsoft Access dan Excel.
Server tertaut menawarkan keuntungan berikut:
Baca lebih lanjut tentang Server Tertaut .
Objek Server -> Server Tertaut -> Server Tertaut Baru
Berikan Nama Server Jarak Jauh.
Pilih Jenis Server Jarak Jauh (SQL Server atau Lainnya).
Pilih Keamanan -> Dibuat menggunakan konteks keamanan ini dan berikan login dan kata sandi server jarak jauh.
Klik OK dan Anda selesai !!
Berikut ini adalah tutorial sederhana untuk membuat server tertaut.
ATAU
Anda dapat menambahkan server tertaut menggunakan kueri.
Sintaksis:
sp_addlinkedserver [ @server= ] 'server' [ , [ @srvproduct= ] 'product_name' ]
[ , [ @provider= ] 'provider_name' ]
[ , [ @datasrc= ] 'data_source' ]
[ , [ @location= ] 'location' ]
[ , [ @provstr= ] 'provider_string' ]
[ , [ @catalog= ] 'catalog' ]
Baca lebih lanjut tentang sp_addlinkedserver .
Anda harus membuat server tertaut hanya sekali . Setelah membuat server tertaut, kami dapat menanyakannya sebagai berikut:
select * from LinkedServerName.DatabaseName.OwnerName.TableName
SELECT
*
FROM
[SERVER2NAME].[THEDB].[THEOWNER].[THETABLE]
Anda juga dapat melihat menggunakan Server Tertaut. Server yang ditautkan dapat berupa jenis sumber data lain juga seperti platform DB2. Ini adalah salah satu metode untuk mencoba mengakses DB2 dari SQL Server TSQL atau panggilan Sproc ...
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.
Permintaan di 2 basis data yang berbeda adalah kueri yang didistribusikan. Berikut adalah daftar beberapa teknik ditambah pro dan kontra:
coba ini:
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
Ini semua adalah jawaban yang baik, tetapi yang ini hilang dan memiliki kegunaan yang kuat. Mungkin itu tidak sesuai dengan yang diinginkan OP, tetapi pertanyaannya tidak jelas dan saya merasa orang lain mungkin menemukan jalan mereka di sini. Pada dasarnya Anda dapat menggunakan 1 jendela untuk secara bersamaan menjalankan kueri terhadap beberapa server, berikut caranya:
Dalam SSMS, buka Server Terdaftar dan buat Grup Server Baru di bawah Grup Server Lokal .
Di bawah grup ini buat Registrasi Server Baru untuk setiap server yang ingin Anda query. Jika nama-nama DB berbeda pastikan untuk menetapkan default untuk masing-masing di properti.
Sekarang kembali ke Grup yang Anda buat di langkah pertama, klik kanan dan pilih Permintaan Baru. Jendela permintaan baru akan terbuka dan permintaan apa pun yang Anda jalankan akan dijalankan pada setiap server dalam grup. Hasilnya disajikan dalam satu set data tunggal dengan nama kolom tambahan yang menunjukkan dari server mana catatan itu berasal. Jika Anda menggunakan bilah status, Anda akan perhatikan bahwa nama server diganti dengan banyak .
Saya memiliki masalah yang sama untuk menghubungkan SQL_server 2008 ke SQL_server 2016 yang di-host di server jauh. Jawaban lain tidak langsung bagi saya. Saya menulis solusi tweak saya di sini karena saya pikir ini mungkin berguna untuk orang lain.
Jawaban yang diperluas untuk koneksi IP db jarak jauh:
Langkah 1: tautan server
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'
... di mana SRV_NAME
nama ditemukan. Kami akan menggunakannya untuk merujuk ke server jarak jauh dari pertanyaan kami. aaa.bbb.ccc.ddd
adalah alamat ip dari server jauh yang menghosting SQLserver DB Anda.
Langkah 2: Jalankan pertanyaan Anda Misalnya:
SELECT * FROM [SRV_NAME].your_remote_db_name.dbo.your_table
... dan itu saja!
Detail sintaks: sp_addlinkedserver dan sp_addlinkedsrvlogin
Membuat definisi Linked Server di satu server dengan yang lain (Anda perlu SA untuk melakukan ini), lalu rujuk saja dengan penamaan 4-bagian (lihat BOL).
Server 2008:
Ketika di SSMS terhubung ke server1.DB1 dan coba:
SELECT * FROM
[server2].[DB2].[dbo].[table1]
seperti yang dicatat orang lain, jika tidak berhasil itu karena server tidak terhubung.
Saya mendapatkan kesalahan:
Tidak dapat menemukan server DB2 di sys.servers. Pastikan nama server yang benar telah ditentukan. Jika perlu, jalankan prosedur tersimpan sp_addlinkedserver untuk menambahkan server ke sys.servers.
Untuk menambah server:
referensi: Untuk menambah server menggunakan sp_addlinkedserver Tautan: [1]: Untuk menambahkan server menggunakan sp_addlinkedserver
Untuk melihat apa yang ada di sys.servers Anda cukup kueri itu:
SELECT * FROM [sys].[servers]
Seperti @ Super9 diceritakan tentang OPENDATASOURCE menggunakan SQL Server Authentication dengan penyedia data SQLOLEDB . Saya hanya memposting di sini potongan kode untuk satu tabel dalam database saat ini tempat kode berjalan dan yang lain di server lain '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
Saya tahu ini adalah pertanyaan lama tetapi saya menggunakan sinonim. Seharusnya kueri dijalankan di dalam server database A, dan mencari tabel di server database B yang tidak ada di server A. Tambahkan kemudian sinonim pada database yang memanggil tabel Anda dari server B. Permintaan Anda tidak harus sertakan skema apa pun, atau nama database yang berbeda, cukup panggil nama tabel seperti biasa dan itu akan berfungsi.
Tidak perlu menautkan server karena sinonim per katakan adalah semacam tautan.
Objek Server ---> server tertaut ---> server tertaut baru
Di server yang terhubung tulis nama server atau alamat IP untuk server lain dan pilih SQL Server Di Keamanan pilih (dibuat menggunakan konteks keamanan ini) Tulis login dan kata sandi untuk server lain
Sekarang terhubung lalu gunakan
Select * from [server name or ip addresses ].databasename.dbo.tblname
Solusi yang disederhanakan untuk menambahkan server yang ditautkan
Server pertama
EXEC sp_addlinkedserver @server='ip,port\instancename'
Login Kedua
EXEC sp_addlinkedsrvlogin 'ip,port\instancename', 'false', NULL, 'remote_db_loginname', 'remote_db_pass'
Jalankan permintaan dari yang ditautkan ke db lokal
INSERT INTO Tbl (Col1, Col2, Col3)
SELECT Col1, Col2, Col3
FROM [ip,port\instancename].[linkedDBName].[linkedTblSchema].[linkedTblName]