2010-02-05 5 views
7

Je fais des requêtes assez complexes sur un serveur distant lié, et il serait utile de pouvoir stocker des informations dans des tables temporaires, puis d'effectuer des jointures, tout cela avec les données distantes. Créer les tables temporaires localement et se joindre contre eux sur le fil est extrêmement lent.Est-il possible de créer une table temporaire sur un serveur lié?

Est-il possible de forcer la création de la table temporaire sur le serveur distant? Supposons que je n'ai pas suffisamment de privilèges pour créer mes propres tables réelles (permanentes).

Répondre

2

Il n'est pas possible de créer directement des tables temporaires sur un serveur distant lié. En fait, vous ne pouvez pas utiliser de DDL sur un serveur lié.

Pour plus d'informations sur les directives et les limites de l'utilisation des serveurs liés voir:

Guidelines for Using Distributed Queries (SQL 2008 Books Online)

Un travail autour (et du haut de ma tête, et cela ne fonctionne que si vous avait des autorisations sur le serveur distant) vous pouvez:

  • sur le serveur distant ont une procédure stockée qui créerait une table persistante, avec une base de nom d sur un paramètre IN
  • la procédure stockée à distance s'exécuter une requête puis insérez les résultats dans ce tableau
  • Scrutez ensuite localement contre cette table effectuer toutes les jointures à toutes les tables locales nécessaires
  • Appel une autre procédure stockée sur la serveur distant pour supprimer la table distante lorsque vous avez terminé

Pas idéal, mais un travail possible.

4

Cela fonctionne à partir de SQL 2005 SP3 lié à SQL 2005 SP3 dans mon environnement. Toutefois, si vous inspectez le tempdb, vous constaterez que la table est réellement sur l'instance locale et non sur l'instance distante. J'ai vu cela comme une résolution sur d'autres forums et je voulais vous détourner de cela.

create table SecondServer.#doll 
(
    name varchar(128) 
) 
GO 
insert SecondServer.#Doll 
select name from sys.objects where type = 'u' 


select * from SecondServer.#Doll 
1

Si la mémoire n'est pas vraiment un problème, vous pouvez également utiliser des variables de table comme alternative aux tables temporaires. Cela a fonctionné pour moi lors de l'exécution d'une procédure stockée avec besoin de stockage de données temporaire sur un serveur lié.

Plus d'informations: par exemple this comparison de variables de tableau et de tables temporaires, y compris les inconvénients de l'utilisation de variables de table.

+0

L'inconvénient est que, autant que je sache, vous ne pouvez pas créer des index sur les variables de table. (J'ai 2 ans de retard, je sais ...) – alfoks

+2

Il semble que vous pouvez [créer des index sur des variables de table] (http://sqlserverplanet.com/tsql/create-index-on-table-variable). (Je ne le savais pas non plus!) – Josien

+0

Super! Merci d'avoir partagé. Je l'aurai dans l'esprit à l'avenir. – alfoks

2

Oui, vous pouvez mais cela ne dure que la durée de la connexion. Vous devez utiliser la syntaxe EXECUTE AT;

EXECUTE('SELECT * INTO ##example FROM sys.objects; WAITFOR DELAY ''00:01:00''') AT [SERVER2] 

Sur le serveur SERVER2, les opérations suivantes fonctionneront (pendant 1 minute);

SELECT * FROM ##example 

mais cela ne fonctionnera pas sur le serveur local. Incidemment si vous ouvrez une transaction sur le deuxième serveur qui utilise l'exemple ##, l'objet reste jusqu'à ce que la transaction soit fermée. Il arrête également l'instruction de création sur le premier serveur. c'est-à-dire sur server2 run et la transaction sur server1 se poursuivra indéfiniment.

BEGIN TRAN 
SELECT * FROM ##example WITH (TABLOCKX) 

Ceci est plus académique que d'une utilisation pratique!

1

J'ai 2 ans de retard à la fête mais vous pouvez le faire en utilisant sp_executeSQL et en lui fournissant une requête dynamique pour créer la table à distance.

Exec RemoteServer.RemoteDatabase.RemoteSchema.SP_ExecuteSQL N'Create Table here'

Cela exécutera la création de table temporaire à l'emplacement distant ..

Questions connexes