Query di esempio di SQL Server Linked Server


93

Mentre in Management Studio, sto cercando di eseguire una query / fare un join tra due server collegati. Questa è una sintassi corretta utilizzando server database collegati:

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

Fondamentalmente, devi solo inserire il nome del server db in db.table?

Risposte:


186

Il formato dovrebbe probabilmente essere:

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

Ad esempio: DatabaseServer1.db1.dbo.table1


Aggiornamento : so che questa è una vecchia domanda e la risposta che ho è corretta; tuttavia, penso che chiunque altro si imbattesse in questo dovrebbe sapere alcune cose.

Vale a dire, quando si esegue una query su un server collegato in una situazione di join, l' INTERA tabella dal server collegato verrà probabilmente scaricata sul server da cui viene eseguita la query per eseguire l'operazione di join. Nel caso dell'OP, sia table1from DB1che table1from DB2verranno trasferiti nella loro interezza al server che esegue la query, presumibilmente denominato DB3.

Se si dispone di tabelle di grandi dimensioni, potrebbe verificarsi un'operazione che richiede molto tempo per essere eseguita. Dopotutto, ora è limitato dalla velocità del traffico di rete che è di ordini di grandezza inferiore alla velocità di trasferimento della memoria o persino del disco.

Se possibile, eseguire una singola query sul server remoto, senza aderire a una tabella locale, per estrarre i dati necessari in una tabella temporanea. Quindi interroga su quello.

Se ciò non è possibile, è necessario esaminare le varie cose che farebbero sì che il server SQL debba caricare l'intera tabella localmente. Ad esempio utilizzando GETDATE()o anche determinati join. Altri assassini di prestazioni includono il mancato conferimento dei diritti appropriati.

Vedi http://thomaslarock.com/2013/05/top-3-performance-killers-for-linked-server-queries/ per ulteriori informazioni.


11
se il nome del server del database ha un trattino, è necessario racchiuderlo tra parentesi quadre
bmw0128

4
@ bmw0128: Meglio ancora, usa le virgolette doppie: è supportata da quasi tutte le piattaforme, a differenza delle parentesi quadre di Microsoft.

2
È inoltre necessario utilizzare le parentesi quadre o le virgolette doppie quando il nome del server del database contiene un punto.
David Brunow

4
In caso di dubbi su uno qualsiasi dei qualificatori, eseguire il drill-down a una tabella in un server collegato in SSMS Object Explorer, fare clic con il pulsante destro del mouse e Script Table as, SELECT To e New Query Editor Window. L'istruzione SELECT risultante includerà il percorso corretto e completo della tabella. Avevo un qualificatore di database misterioso lavorando con Sybase e questo mi ha dato il nome corretto.
John Mo,

Penso che tu non abbia ragione nel dire che l'intera tabella verrà trasferita. Puoi fornire qualche riferimento su dove hai ottenuto queste informazioni? Ho appena provato a unirmi a una tabella con 204 milioni di righe (16 GB di dati, 6,6 GB di indice) su un server collegato e ci sono voluti 47 ms per collegarsi a 5 delle righe, 7 ms sulla seconda query poiché i dati erano presumibilmente memorizzati nella cache. Forse se la tua iscrizione richiedesse una scansione della tabella sulla tabella collegata, dovrebbe trasferire tutto?
Jason Goemaat

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

Questo potrebbe aiutarti.


Votato. Funziona quando colleghi MySQL a MS SQL.
Baz Guvenkaya

3
In altre parole, si crea una query pass-through. Tenere presente che l'istruzione della query deve essere scritta nell'SQL nativo per il server. La sintassi per Oracle è diversa da Teradata diversa da SQL Server ecc.
AxGryndr

10

Se riscontri ancora problemi con <server>.<database>.<schema>.<table>

Racchiudi il nome del server in []


Attenzione: ho eseguito una tabella di creazione dalla selezione utilizzando [] e invece di essere creata sul server collegato, la tabella è stata creata localmente con un nome comedbo.databaseserver1.db1.dbo.table1
biscuit314

9

Per coloro che hanno problemi con queste altre risposte , provaOPENQUERY

Esempio:

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

Funziona per SQL Server
Tom Stickel

8

È necessario specificare lo schema / proprietario (dbo per impostazione predefinita) come parte del riferimento. Inoltre, sarebbe preferibile utilizzare lo stile di join più recente (ANSI-92).

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

la sintassi del join interno è preferibile ai join impliciti?
bmw0128

2
@ bmw0128: Sì, per diversi motivi. IMHO, la cosa più importante è che è fin troppo facile scrivere accidentalmente un join di prodotto incrociato quando hai i tuoi tavoli e join in due posti diversi.

Notare che le 4 parti tratteggiate NON FUNZIONANO per alcuni server collegati non SQL Server. Può generare un errore come ... È stato specificato uno schema o un catalogo non valido per il provider "MSDASQL" per il server collegato "MyLinkedServer".
brewmanz

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

Questo è il modo corretto per chiamare. Assicurati di verificare che i server siano collegati prima di eseguire la query!

Per verificare la presenza di server collegati, chiama:

EXEC sys.sp_linkedservers 

Questo NON FUNZIONA per alcuni server collegati non SQL Server. Solleva un errore come ... È stato specificato uno schema o un catalogo non valido per il provider "MSDASQL" per il server collegato "MyLinkedServer".
brewmanz

4
select name from drsql01.test.dbo.employee
  • drslq01 è servernmae - server collegato
  • test è il nome del database
  • dbo è lo schema predefinito
  • dipendente è il nome della tabella

Spero che aiuti a capire come eseguire la query per il server collegato


2

Di solito le query dirette non dovrebbero essere utilizzate in caso di server collegato perché utilizza pesantemente il database temporaneo del server SQL. Nella prima fase i dati vengono recuperati nel database temporaneo, quindi viene eseguito il filtro. Ci sono molte discussioni su questo. È preferibile utilizzare OPENQUERY aperto perché passa SQL al server collegato di origine e quindi restituisce risultati filtrati, ad es

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

Questa risposta non include un nome di database
Chris Nevill,

2
Ho fornito le informazioni sul database durante la creazione del server collegato. Per i dettagli puoi vedere sotto il link MSDN: msdn.microsoft.com/en-us/library/ff772782(v=sql.110).aspx
Muhammad Yaseen

Cosa posso fare se il mio server collegato richiede l'autenticazione e sto solo cercando di eseguire una query dalla mia applicazione PHP utilizzando PDO?
nekiala

Come eseguiresti un join dal database 1 al database sul server collegato, utilizzando questo approccio?
eaglei22

2

Per quello che vale, ho trovato che la seguente sintassi funziona al meglio:

SELEZIONA * DA [LINKED_SERVER] ... [TABELLA]

Non sono riuscito a far funzionare i consigli di altri, utilizzando il nome del database. Inoltre, questa origine dati non ha uno schema.


2

fare clic con il tasto destro su una tabella e fare clic su tabella di script come selezionato

inserisci qui la descrizione dell'immagine


Non è quello che ha chiesto l'OP
Fandango68

2
questo mostra come ottenere la sintassi corretta per la query di selezione su una tabella collegata. il risultato è come la risposta di Seans
Shimon Doodkin il

1
@ShimonDoodkin, un eccellente esempio di non darmi un pesce, ma insegnami a pescare
Amro

0

La seguente query funziona meglio.

Prova questa query:

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

È molto utile collegare MySQL a MS SQL


0

PostgreSQL :

  1. È necessario fornire un nome database nel DSN origine dati .
  2. Esegui Management Studio come amministratore
  3. È necessario omettere il DBName dalla query :

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.