2010-02-27 3 views
2

Je l'ai utilisé sp_addlinkedserver pour accéder aux machines distantes db maintenant je suis en train d'écrire des requêtes explicitement sur la base de données comme,base de données distante de requête à l'aide du serveur SQL?

select * from [serveur \ instance] .database.owner.tablename

Maintenant, avec cela,

  1. [Server \ instance]: il doit être fourni explicitement
  2. [base de données]: pouvons-nous trouver des bases de données sur l'instance spécifique utilisant la requête comme ms_ForEachDB?
  3. [propriétaire]: Peut-on trouver le nom du propriétaire de la base de données en utilisant la requête?

Si ces valeurs sont trouvées en utilisant des requêtes, est-ce que nous avons besoin d'utiliser EXEC() pour l'exécuter ou pouvons-nous encore l'obtenir en utilisant de belles requêtes?

Merci à tous,

Répondre

6

Le format que vous mentionnez est simplement une référence d'objet 4 partie "agréable".

select * from [server\instance].database.owner.tablename 

3 partie

select * from database.owner.tablename 

2 partie

select * from owner.tablename 

Si vous souhaitez modifier dynamiquement l'un des serveurs, des valeurs db ou schéma alors vous avez une option:

EXEC (@sqlstring) 

Toutefois, si vous accédez uniquement à stor ed procs à distance ...

DECLARE @RemoteSP varchar(500) 

SET @RemoteSP = '[server\instance].database2.schema.proc2' 
EXEC @RemoteSP @p1, @p2, @p3 OUTPUT 

SET @RemoteSP = '[server\instance].database1.schema.proc1' 
EXEC @RemoteSP @p4, @p5, @p6 OUTPUT 

Cependant, la modification des composants de la référence d'objet n'a pas de sens sans doute: si vous savez que vous allez interroger une table, alors il suffit d'appeler cette table dans cette base de données ...

2

vous devez faire une chaîne de requête, puis exécutez par exec() fonction.

obtenir le nom du serveur:

SELECT @@SERVERNAME 

obtenir le nom courant db:

SELECT DB_NAME() AS DataBaseName 
0

vous ne devez pas utiliser EXEC vous pouvez utiliser quelque chose comme select * from openquery(MyLinkedServer,@sql) si je préfère EXEC(@sql) AT MyLinkedServer

Mais tous les travaux

0

S'il arrive que vous avez besoin d'utiliser une sorte de variable dans vos arguments (par ex.recueillir les mises à jour du serveur de distance depuis hier):

DECLARE @yesterday NVARCHAR(20) = '2016-09-23 08:16:20'; 
DECLARE @sql NVARCHAR(MAX) = N'SELECT * FROM database.targetTable AS origin 
          WHERE origin.columnWithDateTime >'''[email protected]+''';'; 
PRINT @sql; 
EXEC(@sql) AT linkedServer 

______

Où:

database.targetTable: Pour une raison SSMS 2008 retourne R2 erreur si vous décrivez comme [base de données]. [targetTable], et je ne sais pas pourquoi cela arrive.

@yesterday: La variable que vous souhaitez insérer (ce cas, une chaîne contenant élément comme datetime)

IMPRIMER @sql: Juste pour vérifier si les guillemets sont correctement placés.

columnWithDateTime:. Devrait être une colonne avec format datetime (par exemple "horodatage", ou similaire à la @yesterday Format de variable

"OPENQUERY n'accepte pas les variables pour ses arguments." : See Here (MSDN: OPENQUERY (Transact-SQL)).

Questions connexes