Come posso selezionare i dati nella stessa query da due database diversi che si trovano su due server diversi in SQL Server?
Come posso selezionare i dati nella stessa query da due database diversi che si trovano su due server diversi in SQL Server?
Risposte:
Quello che stai cercando sono i server collegati. Puoi accedervi in SSMS dalla seguente posizione nella struttura di Esplora oggetti:
Server Objects-->Linked Servers
oppure puoi usare sp_addlinkedserver .
Devi solo crearne uno. Una volta che hai quello, puoi chiamare un tavolo sull'altro server in questo modo:
select
*
from
LocalTable,
[OtherServerName].[OtherDB].[dbo].[OtherTable]
Nota che il proprietario non è sempre dbo
, quindi assicurati di sostituirlo con qualunque schema tu usi.
[OtherServerName].[OtherDB]..[OtherTable]
tuttavia, è meglio includerlo se noto.
Puoi farlo utilizzando il server collegato.
I server tipicamente collegati sono configurati per consentire al Motore di database di eseguire un'istruzione Transact-SQL che include le tabelle in un'altra istanza di SQL Server o un altro prodotto di database come Oracle. Molte origini dati OLE DB possono essere configurate come server collegati, inclusi Microsoft Access ed Excel.
I server collegati offrono i seguenti vantaggi:
Per saperne di più server collegati .
Oggetti server -> Server collegati -> Nuovo server collegato
Fornire il nome del server remoto.
Selezionare il tipo di server remoto (SQL Server o altro).
Selezionare Sicurezza -> Effettuare utilizzando questo contesto di sicurezza e fornire login e password del server remoto.
Fai clic su OK e hai finito !!
Qui un semplice tutorial per creare un server collegato.
O
È possibile aggiungere un server collegato tramite query.
Sintassi:
sp_addlinkedserver [ @server= ] 'server' [ , [ @srvproduct= ] 'product_name' ]
[ , [ @provider= ] 'provider_name' ]
[ , [ @datasrc= ] 'data_source' ]
[ , [ @location= ] 'location' ]
[ , [ @provstr= ] 'provider_string' ]
[ , [ @catalog= ] 'catalog' ]
Ulteriori informazioni su sp_addlinkedserver .
Devi creare un server collegato solo una volta . Dopo aver creato il server collegato, possiamo interrogarlo come segue:
select * from LinkedServerName.DatabaseName.OwnerName.TableName
SELECT
*
FROM
[SERVER2NAME].[THEDB].[THEOWNER].[THETABLE]
Puoi anche guardare usando i server collegati. I server collegati possono essere anche altri tipi di origini dati come le piattaforme DB2. Questo è un metodo per tentare di accedere a DB2 da una chiamata SQL Server TSQL o 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.
La query su 2 database diversi è una query distribuita. Ecco un elenco di alcune tecniche più i pro ei contro:
prova questo:
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
Queste sono tutte ottime risposte, ma questa manca e ha i suoi usi potenti. Forse non si adattava a ciò che voleva l'OP, ma la domanda era vaga e sento che altri potrebbero trovare la loro strada qui. Fondamentalmente puoi usare 1 finestra per eseguire contemporaneamente una query su più server, ecco come:
In SSMS aprire Server registrati e creare un nuovo gruppo di server in server locale Gruppi .
Sotto questo gruppo creare la Registrazione nuovo server per ciascun server che si desidera interrogare. Se i nomi dei DB sono diversi, assicurarsi di impostare un valore predefinito per ciascuno nelle proprietà.
Ora torna al gruppo creato nel primo passaggio, fai clic con il pulsante destro del mouse e seleziona Nuova query. Si aprirà una nuova finestra di query e qualsiasi query eseguita verrà eseguita su ciascun server del gruppo. I risultati sono presentati in un singolo set di dati con un nome di colonna aggiuntivo che indica da quale server proviene il record. Se si utilizza la barra di stato, si noterà che il nome del server viene sostituito con più .
Ho avuto lo stesso problema per connettere un SQL_server 2008 a un SQL_server 2016 ospitato in un server remoto. Altre risposte non hanno funzionato per me in modo diretto. Scrivo qui la mia soluzione ottimizzata poiché penso possa essere utile per qualcun altro.
Una risposta estesa per le connessioni db IP remote:
Passaggio 1: collegare i 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'
... dov'è SRV_NAME
un nome inventato. Lo useremo per fare riferimento al server remoto dalle nostre query.aaa.bbb.ccc.ddd
è l'indirizzo IP del server remoto che ospita il tuo DB SQL Server.
Passaggio 2: eseguire le query Ad esempio:
SELECT * FROM [SRV_NAME].your_remote_db_name.dbo.your_table
... e basta!
Dettagli della sintassi: sp_addlinkedserver e sp_addlinkedsrvlogin
Ha creato una definizione di server collegato in un server all'altro (per farlo è necessario SA), quindi fai semplicemente riferimento a questi con nomi in 4 parti (vedi BOL).
Server 2008:
Quando sei in SSMS connesso a server1.DB1 e prova:
SELECT * FROM
[server2].[DB2].[dbo].[table1]
come altri hanno notato, se non funziona è perché il server non è collegato.
Ottengo l'errore:
Impossibile trovare il server DB2 in sys.servers. Verificare che sia stato specificato il nome del server corretto. Se necessario, eseguire la procedura memorizzata sp_addlinkedserver per aggiungere il server a sys.servers.
Per aggiungere il server:
riferimento: per aggiungere il server usando sp_addlinkedserver Link: [1]: per aggiungere un server usando sp_addlinkedserver
Per vedere cosa c'è nei tuoi server sys basta interrogarlo:
SELECT * FROM [sys].[servers]
Come @ Super9 ha raccontato di OPENDATASOURCE utilizzando l'autenticazione di SQL Server con il fornitore di dati SQLOLEDB . Sto solo postando qui uno snippet di codice per una tabella nell'attuale database sever in cui il codice è in esecuzione e un altro nell'altro server "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
So che questa è una vecchia domanda, ma uso i sinonimi. Presumibilmente la query viene eseguita all'interno del server di database A e cerca una tabella in un server di database B che non esiste sul server A. Aggiungi quindi un sinonimo su un database che chiama la tabella dal server B. La tua query non deve includere eventuali schemi o nomi di database diversi, basta chiamare il nome della tabella come al solito e funzionerà.
Non è necessario collegare i server in quanto i sinonimi per dire sono una specie di collegamento.
Oggetti server ---> server collegato ---> nuovo server collegato
Nel server collegato scrivere il nome del server o l'indirizzo IP per l'altro server e selezionare SQL Server In Security selezionare (essere effettuato utilizzando questo contesto di sicurezza) Scrivere login e password per l'altro server
Ora connesso, quindi utilizza
Select * from [server name or ip addresses ].databasename.dbo.tblname
Soluzione semplificata per l'aggiunta di server collegati
Primo server
EXEC sp_addlinkedserver @server='ip,port\instancename'
Secondo accesso
EXEC sp_addlinkedsrvlogin 'ip,port\instancename', 'false', NULL, 'remote_db_loginname', 'remote_db_pass'
Eseguire query da collegate a db locali
INSERT INTO Tbl (Col1, Col2, Col3)
SELECT Col1, Col2, Col3
FROM [ip,port\instancename].[linkedDBName].[linkedTblSchema].[linkedTblName]