在远程服务器上选择@@ServerName 返回本地@@ServerName

问题描述

我有两台服务器 [TESLABsql01T][TESLABsql02T],我想远程监控它们的连接。

昨天一个用户 suggested me 一个可以帮助我的查询,该查询确实有效:

DECLARE @ServerName varchar(50),@Dynamicsql NVARCHAR(MAX)
DECLARE @myTableVariable TABLE (id INT,ServerName varchar(50))
insert into @myTableVariable values(1,'[TESLABsql01T]'),(2,'[TESLABsql02T]')
-- select * from @myTableVariable

Declare VarCursor cursor for
Select ServerName from @myTableVariable
Open VarCursor
FETCH NEXT FROM VarCursor INTO @ServerName
WHILE @@FETCH_STATUS = 0 
BEGIN
    SET @Dynamicsql='SELECT @@ServerName AS [ServerName],NAME AS DatabaseName,COUNT(STATUS) AS [NumberOfConnections],GETDATE() AS [TimeStamp],hostname,program_name,loginame
    FROM '+@ServerName+'.master.sys.databases sd
    LEFT JOIN '+@ServerName+'.master.sys.sysprocesses sp ON sd.database_id = sp.dbid
    WHERE database_id NOT BETWEEN 1 AND 4
    GROUP BY NAME,loginame'
    

    EXEC (@Dynamicsql)

    FETCH NEXT FROM VarCursor INTO @ServerName
END
CLOSE VarCursor
DEALLOCATE VarCursor

问题是 qiery 在我的本地服务器上将 [TESLABsql01T] 作为 @@ServerName 返回,但也为远程 [TESLABsql01T] 返回 @@ServerName

enter image description here

这是错误的,它应该返回 [TESLABsql02T]

解决方法

@@ServerName 将始终为您提供本地服务器名称,除非您通过 OPENQUERY 执行查询。

如果您想使用与动态查询相同的变量 @ServerName(链接服务器名称),那么只需更改您的动态 SQL 即可使用它。

    SET @DynamicSQL = 'SELECT ' + QUOTENAME(@ServerName,'''') + ' AS [ServerName]

如果您想要远程服务器为自己使用的名称,那么您可以在动态部分中使用相关子查询:

    SET @DynamicSQL = 'SELECT (SELECT name FROM sys.servers srv WHERE srv.server_id = 0) AS [ServerName]