问题描述
我有两台服务器 [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
。
解决方法
@@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]