微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决在远程服务器上选择@@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]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。