2010-08-04 8 views
1

Basé sur les 2 bases de données ci-dessous:aide t-sql serveur lié

Database_A on Server_1 
Database_B on Server_2 

je created a linked server to Database_B on Server_1 instance by name 'LS_B'.

J'ai un énorme fichier de script qui crée essentiellement des tables nécessaires, des fonctions, des vues et procédures stockées sur Database_A.

Ces fonctions, vues et procédures stockées se réfèrent à leur tour aux tables Database_B.

Le problème est que je dois maintenant aller et inclure OPENQUERY(LS_B,<query refering to database_b table>) partout dans le fichier de script.

Par exemple

create procedure some_proc 
as 
begin 
    select * from openquery(LS_B, 'select * from [Database_B].[dbo].[Table_1]'); 
end 

est-il une meilleure façon de le faire?

Pls. suggérer.

Merci

mise à jour

pourquoi cette échouent

select top (50) * from LS_B.[Database_B].[dbo].[Table_1] 

tandis que les travaux ci-dessous

select * from OpenQuery(LS_B, 'select top (50) * from Database_B.dbo.Table_1') 

Le message d'erreur sur l'exécution de la première requête est

Impossible de traiter l'objet "" Database_B "." Dbo "." Table_1 "". Le fournisseur OLE DB "SQLNCLI10" pour le serveur lié "LS_B" indique que l'objet n'a pas de colonnes ou l'utilisateur actuel n'a pas d'autorisations sur cet objet

Les deux serveurs sont sur le même domaine.

+1

'OPENQUERY' est seulement utile si vous êtes se connecter à une base de données autre que SQL Server (ou à des versions antérieures ne prenant pas en charge une syntaxe particulière) en raison de la transmission directe de la requête. Le pass-through vous permet d'écrire pour l'autre base de données en SQL natif - IE: TO_DATE sur Oracle, etc. –

+0

@OMG Ponies: Merci d'avoir expliqué cela. J'ai édité ma question pour présenter le nouveau problème auquel je suis confronté. Pouvez-vous pls. fournir une suggestion quant à ce qui peut être fait à ce sujet? Merci. – stackoverflowuser

+0

Testé sur SQL Server 2005 - fonctionne pour moi, avec et sans crochets. Êtes-vous sûr de tester une instance dans laquelle cette instance de serveur lié est présente? Dans Management Studio, dans l'Explorateur d'objets - qu'est-ce qui est répertorié sous Objets serveur \ Serveurs liés (en supposant que vous ayez des autorisations à voir)? –

Répondre

2

Si les deux serveurs sont des serveurs SQL, vous pouvez utiliser la syntaxe suivante:

select * from LS_B.[Database_B].[dbo].[Table_1] 

Cela dépend de votre syntaxe exisitng si ce serait plus facile de faire une recherche et de remplacement.

Vous pouvez aussi créer un groupe de vues sur le serveur 1 du nom des tables refered dans les sps, puis ont ces vues refernce le serveur lié:

CREATE VIEW Table_1 
AS 
select * from LS_B.[Database_B].[dbo].[Table_1] 
+0

+1: Vous me battez, voici un lien vers la documentation sur la syntaxe du nom qualifié: http://msdn.microsoft.com/en-us/library/aa172676%28SQL.80%29.aspx –

+0

A [synonyme] (http://technet.microsoft.com/en-us/library/ms177544.aspx) est une alternative à une vue. –

+0

@Ben: Je reçois l'erreur ci-dessous lors de l'exécution Impossible de traiter l'objet "" Database_B "." Dbo "." Table_1 "". Le fournisseur OLE DB "SQLNCLI10" pour le serveur lié "LS_B" indique que l'objet n'a pas de colonnes ou l'utilisateur actuel n'a pas d'autorisations sur cet objet. Mais la même chose fonctionne quand j'exécute sélectionnez * from openquery (LS_B, 'select * from [Database_B]. [Dbo]. [Table_1]') – stackoverflowuser