2010-11-03 11 views
61

Dans Management Studio, j'essaie d'exécuter une requête/faire une jointure entre deux serveurs liés. Est-ce une syntaxe correcte à l'aide des serveurs liés db:Exemple de serveur SQL Server lié

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

Fondamentalement, vous préfacer juste le nom du serveur db au db.table?

Répondre

132

Le format devrait probablement être:

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

Par exemple: DatabaseServer1.db1.dbo.table1


Mise à jour: Je sais que c'est une vieille question et la réponse que je avoir est correct; Cependant, je pense que tout le monde qui trébuche sur cela devrait savoir quelques choses.

A savoir, lors de l'interrogation sur un serveur lié dans une jointure situation de la table ENTIER du serveur lié sera probablement être téléchargés sur le serveur de la requête est en cours d'exécution afin de faire 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 exécutant la requête, vraisemblablement nommé DB3.

Si vous avez de grandes tables, ce peut entraîner une opération qui prend beaucoup de temps à s'exécuter. Après tout, il est maintenant contraint par des vitesses de trafic réseau qui sont plus faibles que la mémoire ou même les vitesses de transfert de disque.

Si possible, effectuez une seule requête sur le serveur distant, sans vous joindre à une table locale, pour extraire les données dont vous avez besoin dans une table temporaire. Puis interroger de cela.

Ce n'est pas possible alors vous devez regarder les différentes choses qui obligeraient SQL Server à charger la table entière localement. Par exemple en utilisant GETDATE() ou même certaines jointures. D'autres tueurs de performance incluent ne pas donner les droits appropriés. Pour plus d'informations, voir http://thomaslarock.com/2013/05/top-3-performance-killers-for-linked-server-queries/.

+9

si les bases de données eserver name a un trait d'union, besoin de l'entourer de crochets – bmw0128

+4

@ bmw0128: Mieux encore, utilisez des guillemets doubles: il est supporté par presque toutes les plateformes, contrairement aux crochets de Microsoft. –

+1

Vous devez également utiliser les crochets ou les guillemets lorsque le nom du serveur de base de données comporte une période. –

8

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 nouveau style de jointure (ANSI-92).

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

la syntaxe de jointure interne est préférable aux jointures implicites? – bmw0128

+2

@ bmw0128: Oui, pour plusieurs raisons.À mon humble avis, le plus important est qu'il est trop facile d'écrire accidentellement une jointure de produits croisés lorsque vous avez vos tables et se joint à deux endroits différents. –

+0

Notez que les parties en pointillés ne fonctionnent pas pour certains serveurs liés non-SQL-Server. Il peut générer une erreur comme ... Un schéma ou un catalogue non valide a été spécifié pour le fournisseur "MSDASQL" pour le serveur lié "MyLinkedServer". – brewmanz

7

Si vous trouvez encore problème avec ...

Enclose nom du serveur dans []

+0

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

2
select * from [Server].[database].[schema].[tablename] 

Ceci 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 appellent:

EXEC sys.sp_linkedservers 
+0

Ceci NE FONCTIONNE PAS pour certains serveurs liés non-SQL-Server. Cela provoque des erreurs comme ... Un schéma ou un catalogue invalide a été spécifié pour le fournisseur "MSDASQL" pour le serveur lié "MyLinkedServer". – brewmanz

1

requêtes Habituellement directes ne doivent pas être utilisés en cas de serveur lié car il utilise fortement la base de données de température du serveur SQL.À la première étape, les données sont récupérées dans la base de données temporaire puis un filtrage est effectué. Il y a beaucoup de discussions à ce sujet. Il est préférable d'utiliser OPENQUERY ouvert, car il transmet le code SQL au serveur lié source, puis renvoie les résultats filtrés, par ex.

SELECT * 
FROM OPENQUERY(Linked_Server_Name , 'select * from TableName where ID = 500') 
+0

Cette réponse n'inclut pas le nom de la base de données –

+2

J'ai fourni des informations de base de données lors de la création du serveur lié. Pour plus de détails, vous pouvez voir ci-dessous le lien MSDN: https://msdn.microsoft.com/en-us/library/ff772782(v=sql.110).aspx –

+0

Que puis-je faire si mon serveur lié nécessite une authentification et que ' J'essaie juste d'interroger à partir de mon application PHP en utilisant PDO? – nekiala

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

Cela peut vous aider.

+0

Refusée. Cela fonctionne lorsque vous liez MySQL à MS SQL. –

+1

En d'autres termes, cela crée une requête directe. Gardez à l'esprit que l'instruction de requête doit être écrite dans le SQL natif pour le serveur. Syntaxe pour Oracle étant différent de Teradata différent de SQL Server, etc. – AxGryndr

3

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

Exemple:

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

Works for SQL Server –

0

Pour ce que ça vaut, je l'ai trouvé la syntaxe suivante pour travailler le meilleur:

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

Je n'ai pas pu obtenir les recommandations d'autres s pour travailler, en utilisant le nom de la base de données. En outre, cette source de données n'a aucun schéma.

1
select name from drsql01.test.dbo.employee 
  • drslq01 est servernmae --linked serer
  • test est le nom de la base de données
  • dbo est le schéma -default schéma
  • employé
  • est le nom de la table

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

Questions connexes