114 votes

Exemple de requête du serveur lié SQL Server

Dans Management Studio, j'essaie d'exécuter une requête/une jointure entre deux serveurs liés. Est-ce une syntaxe correcte pour utiliser des serveurs de données liés ?

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

En fait, il suffit de faire précéder le nom du serveur de données par db.table ?

223voto

Chris Lively Points 59564

Le format devrait probablement être :

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

Par exemple : DatabaseServer1.db1.dbo.table1


Mise à jour : Je sais qu'il s'agit d'une vieille question et que la réponse que j'ai est correcte ; cependant, je pense que toute autre personne tombant sur cette question devrait savoir certaines choses.

En effet, lors d'une requête contre un serveur lié dans une situation de jointure, la fonction ENTIRE du serveur lié sera probablement être téléchargée sur le serveur à partir duquel la requête est exécutée afin d'effectuer l'opération de jointure. Dans le cas de l'OP, les deux table1 de DB1 et table1 de DB2 seront transférés dans leur intégralité au serveur qui exécute la requête, vraisemblablement nommé DB3 .

Si vous avez de grandes tables, cette mai se traduisent par une opération qui prend beaucoup de temps à s'exécuter. Après tout, elle est maintenant limitée par la vitesse du trafic réseau, qui est plusieurs fois plus lente que la vitesse de transfert de la mémoire ou même du disque.

Si possible, effectuez une seule requête sur le serveur distant, sans joindre une table locale, afin d'extraire les données dont vous avez besoin dans une table temporaire. Effectuez ensuite une requête à partir de cette table.

Si ce n'est pas possible, il faut alors examiner les différentes raisons pour lesquelles le serveur SQL doit charger la table entière en local. Par exemple, en utilisant GETDATE() ou même certaines jointures. Parmi les autres facteurs qui tuent les performances, citons le fait de ne pas donner les droits appropriés.

Voir http://thomaslarock.com/2013/05/top-3-performance-killers-for-linked-server-queries/ pour plus d'informations.

13 votes

Si le nom du serveur de base de données comporte un trait d'union, il faut l'entourer de crochets.

6 votes

@bmw0128 : Mieux encore, utilisez les guillemets doubles : ils sont supportés par presque toutes les plateformes, contrairement aux crochets de Microsoft.

4 votes

Vous devez également utiliser les crochets ou les guillemets doubles lorsque le nom du serveur de base de données comporte un point.

50voto

Akhilesh Kamate Points 191
SELECT * FROM OPENQUERY([SERVER_NAME], 'SELECT * FROM DATABASE_NAME..TABLENAME')

Cela peut vous aider.

0 votes

Upvoted. Cela fonctionne lorsque l'on relie MySQL à MS SQL.

5 votes

En d'autres termes, il s'agit de créer une requête pass-through. N'oubliez pas que l'instruction de requête doit être écrite dans le langage SQL natif du serveur. La syntaxe d'Oracle est différente de celle de Teradata, de celle de SQL Server, etc.

17voto

Tom Stickel Points 4201

Pour ceux qui ont des difficultés avec ces autres réponses essayez. OPENQUERY

Ejemplo:

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

0 votes

Fonctionne pour SQL Server

0 votes

C'est la seule solution qui fonctionne pour moi. Traduction rapide (peut être utile à certains) : SELECT * INTO NEW_DB.dbo.tblCopy FROM OLD_DB.dbo.tblData des formulaires pour SELECT * INTO NEW_DB.dbo.tblCopy FROM OPENQUERY([server], 'select * from OLD_DB.dbo.tblData')

11voto

Mian Points 66

Si vous rencontrez toujours des problèmes avec <server>.<database>.<schema>.<table>

Entrez le nom du serveur dans le champ []

0 votes

Attention : J'ai exécuté une création de table à partir de select en utilisant [], et au lieu d'être créée sur le serveur lié, la table a été créée localement avec un nom tel que dbo.databaseserver1.db1.dbo.table1

10voto

Joe Stefanelli Points 72874

Vous devez spécifier le schéma/propriétaire (dbo par défaut) dans le cadre de la référence. En outre, il serait préférable d'utiliser le style de jointure plus récent (ANSI-92).

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

0 votes

La syntaxe de la jointure interne est préférable à celle des jointures implicites ?

4 votes

@bmw0128 : Oui, pour plusieurs raisons. IMHO, la plus importante est qu'il est beaucoup trop facile d'écrire accidentellement une jointure de produit croisé lorsque vous avez vos tables et jointures à deux endroits différents.

0 votes

Notez que les parties à 4 points NE FONCTIONNENT PAS pour certains serveurs non liés à SQL-Server. Cela peut provoquer une erreur du type ... Un schéma ou un catalogue invalide a été spécifié pour le fournisseur "MSDASQL" pour le serveur lié "MyLinkedServer".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X