【发布时间】:2021-08-28 03:39:08
【问题描述】:
我有两台服务器 [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,hostname ,program_name ,loginame'
EXEC (@DynamicSQL)
FETCH NEXT FROM VarCursor INTO @ServerName
END
CLOSE VarCursor
DEALLOCATE VarCursor
问题是qiery在我的本地服务器上以@@ServerName的形式返回[TESLABSQL01T],但也为远程@@ServerName返回[TESLABSQL01T]。
这是错误的,它应该返回[TESLABSQL02T]。
【问题讨论】:
-
查询正在本地计算机上运行,即使它连接到远程计算机以获取其中一个或多个表。
-
是的,有解决方法吗?
master中的任何表都包含@@ServerName的值? -
简单明了的是只使用您已经使用的变量将值替换为
FROM子句,例如SELECT ''' + @ServerName + ''' AS [ServerName],除非您尝试解决本地注册的远程服务器名称与远程服务器不匹配的问题。 -
呃,我需要
'''而不是'。如果需要,您可以将其发布为答案。谢谢@Damien_The_Unbeliever
标签: sql sql-server tsql scripting nameservers