繁体   English   中英

远程服务器上的 SELECT @@ServerName 返回本地 @@ServerName

[英]SELECT @@ServerName on remote server returns local @@ServerName

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

昨天一位用户向我建议了一个可以帮助我的查询,并且该查询确实有效:

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,hostname ,program_name ,loginame'
    

    EXEC (@DynamicSQL)

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

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

在此处输入图像描述

这是错误的,它应该返回[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]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM