web-dev-qa-db-fra.com

Exemple de requête de serveur lié SQL Server

Dans Management Studio, j'essaie d'exécuter une requête/une jointure entre deux serveurs liés . La syntaxe est-elle correcte à l'aide des serveurs de base de données liés:

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

Fondamentalement, prévoyez-vous simplement le nom du serveur de base de données sur db.table?

76
bmw0128

Le format devrait probablement être:

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

Par exemple: DatabaseServer1.db1.dbo.table1


Mise à jour: Je sais que cette question est ancienne et que ma réponse est correcte. Cependant, je pense que toute autre personne qui trébuche sur cette question devrait savoir certaines choses.

À savoir, lors de l'interrogation d'un serveur lié dans une situation de jointure, la table ENTI&EGRAVE;RE du serveur lié est probable téléchargée sur le serveur à partir duquel la requête est en cours d'exécution afin d'effectuer la rejoindre l'opération. Dans le cas du PO, table1 de DB1 et table1 de DB2 seront transférés dans leur intégralité au serveur qui exécute la requête, probablement nommé DB3

Si vous avez des tables volumineuses, ceci [peut entraîner une opération longue à exécuter. Après tout, il est maintenant limité par les vitesses de trafic sur le réseau, qui sont de plusieurs ordres de grandeur plus lentes que celles de mémoire ou même de transfert de disque.

Si possible, effectuez une requête unique sur le serveur distant, sans rejoindre une table locale, pour extraire les données dont vous avez besoin dans une table temporaire. Puis interrogez-le. 

Si ce n'est pas possible, vous devez alors examiner les différentes choses qui obligeraient SQL Server à charger la table entière localement. Par exemple, utilisez GETDATE() ou même certaines jointures. Parmi les autres tueurs à la performance, 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.

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

Cela peut vous aider.

19
Akhilesh Kamate

Si vous rencontrez toujours un problème avec <server>.<database>.<schema>.<table>

Placez le nom du serveur dans []

9
Mian

Vous devez spécifier le schéma/propriétaire (dbo par défaut) dans la référence. De même, 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
8
Joe Stefanelli

Pour ceux qui ont des problèmes avec ces autres réponses, essayez OPENQUERY

Exemple:

 SELECT * FROM OPENQUERY([LinkedServer], 'select * from [DBName].[schema].[tablename]') 
7
Tom Stickel
select * from [Server].[database].[schema].[tablename] 

C'est la bonne façon d'appeler. Assurez-vous de vérifier que les serveurs sont liés avant d’exécuter la requête!

Pour vérifier les serveurs liés, appelez:

EXEC sys.sp_linkedservers 
4
Abhishek Jaiswal
select name from drsql01.test.dbo.employee
  • drslq01 est un sereur lié à servernmae
  • test est le nom de la base de données
  • dbo est un schéma - schéma par défaut
  • employé est le nom de la table

J'espère que cela aide à comprendre, comment exécuter une requête pour le serveur lié

2
Jaspreet Singh

En règle générale, les requêtes directes ne doivent pas être utilisées dans le cas d'un serveur lié, car elles utilisent de manière intensive la base de données temporaire du serveur SQL. À la première étape, les données sont extraites dans la base de données temporaire, puis le filtrage est effectué. Il y a beaucoup de discussions à ce sujet. Il est préférable d’utiliser open OPENQUERY car il transmet SQL au serveur lié à la source, puis renvoie les résultats filtrés, par exemple.

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

Suivre la requête est le meilleur travail.

Essayez cette requête:

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

Il aide vraiment à relier MySQL à MS SQL

1
Vijay S

Pour ce que cela vaut, j'ai trouvé la syntaxe suivante qui fonctionne le mieux:

SELECT * FROM [LINKED_SERVER] ... [TABLE]

Je ne pouvais pas obtenir les recommandations des autres, en utilisant le nom de la base de données. De plus, cette source de données n'a pas de schéma.

0
Sean Warren

faites un clic droit sur une table et cliquez sur la table de script en tant que sélectionner

 enter image description here

0
Shimon Doodkin