Eseguire una query SQL da un SQL Server ad un altro


Esaminiamo il modo per eseguire query SQL fra database differenti e server differenti

L'altro giorno mi sono trovato a dover fare query dal mio SQL Server in locale ad un server in remoto, combinando e confrontando dati da uno all'altro.

Fare query fra due database diffenti dello stesso server è molto semplice. Vediamo ad esempio una union fra database differenti.

SELECT Colonna FROM Database1.dbo.Tabella1
UNION
SELECT Colonna FROM Database2.dbo.Tabella2

Semplicissimo. Se dovesse essere frequente di aver bisogno di dover interrogare una tabella da un database differente, si può pensare a due strade.

  • se i dati non cambiano di frequente, si può pensare ad una importazione nel proprio database ad intervalli prefissati
  • se i dati cambiano di frequente, l'importazione potrebbe essere onerosa e problematica. Quindi la cosa più conveniente sarebbe fare una vista al cui interno richiamiamo la tabella dall'altro database nella forma

    SELECT * FROM Database1.dbo.Tabella1

    Attenzione solo ad un fatto. Eventuali chiavi esterne ai dati di questa vista non potrebbero rispettare i vincoli di integrità referenziale. Non è possibile creare relazioni fra dati di database differenti.
    Ultima considerazione: nel caso in cui la frequenza di aggiornamento sia superiore a qualche secondo, quindi frequente, ma non troppo, per migliorare le prestazioni possiamo pensare di rendere la vista statica.

Ma se invece dobbiamo prendere dati da un diverso server? La cosa più semplice da pensare, sarebbe di anteporre nelle query al nome del database, quello della macchina. In questo modo:

SELECT * FROM [ip].Database1.dbo.Tabella1

L'idea è giusta, ma non funziona, perchè occorre prima linkare quella macchina al server da cui parte la query. Per vedere la lista dei server linkati, basta eseguire la query

SELECT * FROM sys.servers

Se il server su cui vorremmo fare la query non è nella lista, dobbiamo aggiungerlo, usando la stored procedure di sistema sp_addlinkedserver. Ad esempio, io l'ho usata in questa forma:

EXEC sp_addlinkedserver  
   @server=N'ip',
   @srvproduct=N'',
   @provider=N'SQLNCLI'

Fatto questo adesso la query precedente funziona. Per chi volesse approfondire questa stored procedure, può leggere la documentazione cliccando qui.
Una ultima considerazione. Ci si potrebbe domandare, ma dove le inserisco le credenziali di autorizzazione a quella macchina? Non nella stored appena citata. Automaticamente vengono prese dai server registrati di quella macchina. Per ulteriori informazioni a questo proposito, vi rimando alla documentazione.



Post correlati: