Domanda

Sto scrivendo uno script che dovrebbe correre un gruppo di server e selezionare una serie di dati su di loro, tra cui il server locale. Lo SQL richieste per selezionare la necessità di dati che è piuttosto complicato, quindi sto scrivendo una sorta di una vista ad-hoc, e utilizzando un'istruzione OPENQUERY per ottenere i dati, quindi in ultima analisi, io finiscono per ciclare su una dichiarazione come questa:

exec('INSERT INTO tabl SELECT * FROM OPENQUERY(@Server, @AdHocView)')

Tuttavia, ho sentito che l'utilizzo OPENQUERY sul server locale viene visto di buon occhio. Qualcuno potrebbe elaborare per spiegare perché?

È stato utile?

Soluzione

  • Anche se la query potrebbe restituire più set di risultati, rendimenti OPENQUERY solo il primo.
  • OPENQUERY non accetta le variabili per i suoi argomenti.
  • OPENQUERY non può essere utilizzato per eseguire stored procedure estese in un server collegato. Tuttavia, una stored procedure estesa può essere eseguito su un server collegato utilizzando un nome in quattro parti.
  • Se la stored procedure sp_addlinkedserver viene utilizzato entro stesso script, le credenziali utilizzate sul server remoto vengono insita nel copione, visibile a chiunque abbia una copia

Riferimento:

Altri suggerimenti

In aggiunta a quanto detto @OMG Ponies, è semplicemente inutile. Non c'è alcun motivo per introdurre la semantica ad-hoc query e transazioni distribuite quando non è necessario. Quando si utilizza OPENQUERY si prende tutti gli aspetti negativi di SQL dinamico, compresi i piani meno prevedibili e l'incapacità del server per monitorare con precisione le dipendenze.

OPENQUERY richiede anche l'utente locale per avere le autorizzazioni per il server di destinazione, che probabilmente non è ciò che si vuole, a meno che sia uno script di gestione. Non si può pretendere ogni utente di un database per avere le stesse autorizzazioni a tutti gli altri database.

Solo un follow-up.

ApriQuery è buono quando si deve confrontare o manipolare alcuni gruppi di righe da stored procedure.

Per esempio, se si deve confrontare i risultati di due server (test e server rollout) durante la migrazione da SQL Server 2005 per server SQL 2008 per esempio, allora si può fare la seguente query:

select * into test_table from OpenQuery(testServer, 'exec testdb.dbo.test_sp');
select * into rollout_table from OpenQuery(rolloutServer, 'exec testdb.dbo.test_sp');

select * from test_table
except
select * from rollout_table;

select * from rollout_table
except
select * from test_table;

per vedere eventuali discrepanze.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top