[英]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.