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?
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.
SELECT * FROM OPENQUERY([SERVER_NAME], 'SELECT * FROM DATABASE_NAME..TABLENAME')
Cela peut vous aider.
Si vous rencontrez toujours un problème avec <server>.<database>.<schema>.<table>
Placez le nom du serveur dans []
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
Pour ceux qui ont des problèmes avec ces autres réponses, essayez OPENQUERY
Exemple:
SELECT * FROM OPENQUERY([LinkedServer], 'select * from [DBName].[schema].[tablename]')
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
select name from drsql01.test.dbo.employee
J'espère que cela aide à comprendre, comment exécuter une requête pour le serveur lié
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')
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
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.