Cela semble être une question de base, mais je ne trouve aucune réponse - j'ai besoin de pouvoir obtenir le nom/l'instance du serveur, etc. à partir d'un serveur lié. J'ai essayé deux ou trois choses:
select <linked server>.@@SERVERNAME;
select <linked server>.SERVERPROPERTY('ServerName');
... mais pas de joie. Des idées?
C'est SQL 2008 R2
& 2014
(2008R2
est le serveur lié)
EDIT: Les erreurs sont:
Msg 102, niveau 15, état 1, ligne 2 Syntaxe incorrecte près de '@@ SERVERNAME'.
Vous pouvez utiliser OPENQUERY
comme expliqué dans MSDN pour obtenir les informations du serveur lié:
c'est-à-dire en utilisant OPENQUERY ( linked_server ,'query' )
avec quelque chose comme ci-dessous vous donnera le nom du serveur en utilisant sys.dm_exec_connections
dmv
SELECT * FROM OPENQUERY (
linkedservername,
'SELECT
@@SERVERNAME AS TargetServerName,
SUSER_SNAME() AS ConnectedWith,
DB_NAME() AS DefaultDB,
client_net_address AS IPAddress
FROM
sys.dm_exec_connections
WHERE
session_id = @@SPID
')
Quelques approches légèrement plus courtes (et plus naturelles, à mon humble avis):
EXEC LinkedServer.[master].sys.sp_executesql N'SELECT @@VERSION;';
Ou:
EXEC('SELECT @@VERSION;') AT LinkedServer;
Je préfère le sp_executesql
route car:
Il permettra toujours des paramètres fortement typés, au lieu de traiter toutes sortes de concaténation de chaînes, d'échapper aux guillemets simples, etc.
Il est facile de spécifier une base de données particulière dans ce chemin, au lieu d'avoir à mettre des préfixes de base de données sur tous les objets référencés dans la requête. Et oui, vous pouvez définir la base de données dynamiquement:
DECLARE @db SYSNAME, @exec NVARCHAR(1024);
SET @db = N'tempdb';
SET @exec = N'LinkedServer.' + QUOTENAME(@db) + N'.sys.sp_executesql';
EXEC @exec N'SELECT @@VERSION, DB_NAME();';
Et le nom du serveur lié, le cas échéant:
DECLARE @srv SYSNAME, @db SYSNAME, @exec NVARCHAR(1024);
SET @srv = N'LinkedServer';
SET @db = N'tempdb';
SET @exec = QUOTENAME(@srv) + N'.' + QUOTENAME(@db) + N'.sys.sp_executesql';
EXEC @exec N'SELECT @@VERSION, DB_NAME();';
Il existe des moyens plus faciles d'obtenir les noms de serveur de vos serveurs liés. Vous pouvez interroger sys.sysservers ou exécuter EXEC sp_linkedservers pour vous donner toutes les informations dont vous avez besoin sur vos serveurs liés locaux, y compris le nom du serveur. Voici le lien sur sp_linkedservers si vous le souhaitez. Bien que cela ne réponde pas nécessairement à la question de savoir comment sélectionner @@ SERVERNAME à distance, cela vous permet d'obtenir ces informations.