运行 查询数组或列表中的每个元素
Run query for each element in array or list
我正在尝试监控访问我们数据库的所有连接。
为此,我创建了这个查询:
SELECT @@ServerName AS [ServerName]
,NAME AS DatabaseName
,COUNT(STATUS) AS [NumberOfConnections]
,GETDATE() AS [TimeStamp]
,hostname
,program_name
,loginame
FROM sys.databases sd
LEFT JOIN master.dbo.sysprocesses sp ON sd.database_id = sp.dbid
WHERE database_id NOT BETWEEN 1 AND 4
GROUP BY NAME,hostname ,program_name ,loginame
GO
这 returns 我正是我在本地计算机上想要的:
很好,ServerName
也有,DatabaseName
也有,NumberOfConnections
也有,等等...
但是如果我想 运行 它到远程服务器怎么办?事实上,在我的实验室中,我有一个名为 [TESLABSQL02T]
的远程服务器,让我们看看我是否可以 query it remotely:
SELECT @@ServerName AS [ServerName]
,NAME AS DatabaseName
,COUNT(STATUS) AS [NumberOfConnections]
,GETDATE() AS [TimeStamp]
,hostname
,program_name
,loginame
FROM [TESLABSQL02T].master.sys.databases sd
LEFT JOIN [TESLABSQL02T].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
太棒了:现在我想监控我的所有网络!
这是事情变得棘手的时候: 我想在每 10 分钟 运行s 并且可以查询大约 30 台服务器的作业中自动执行此操作。
让我们先尝试使用 2 个服务器 [TESLABSQL01T]
和 [TESLABSQL02T]
:
DECLARE @myTableVariable TABLE (id INT, ServerName varchar(50))
insert into @myTableVariable values(1,'[TESLABSQL01T]'),(2,'[TESLABSQL02T]')
select * from @myTableVariable
SELECT @@ServerName AS [ServerName]
,NAME AS DatabaseName
,COUNT(STATUS) AS [NumberOfConnections]
,GETDATE() AS [TimeStamp]
,hostname
,program_name
,loginame
FROM (select ServerName from @myTableVariable).master.sys.databases sd
LEFT JOIN (select ServerName from @myTableVariable).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
不幸的是没有快乐:(
查询在 FROM
和 LEFT JOIN
附近给了我一个 Incorrect syntax
。
如何每 10 分钟在每个远程服务器上向 运行 查询一次?
我应该使用列表、数组、临时 table、普通 table 吗?
我听说 FETCH NEXT FROM ObjectCursor
,可以选择吗?
动态查询?
...每个建议都是有效的。谢谢。
要解决语法错误,您必须使用游标创建动态查询:
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
但对于此查询,您必须确保您在所有服务器中都拥有权限,或者您在主体 SQL 服务器引擎
中拥有链接服务器
我正在尝试监控访问我们数据库的所有连接。
为此,我创建了这个查询:
SELECT @@ServerName AS [ServerName]
,NAME AS DatabaseName
,COUNT(STATUS) AS [NumberOfConnections]
,GETDATE() AS [TimeStamp]
,hostname
,program_name
,loginame
FROM sys.databases sd
LEFT JOIN master.dbo.sysprocesses sp ON sd.database_id = sp.dbid
WHERE database_id NOT BETWEEN 1 AND 4
GROUP BY NAME,hostname ,program_name ,loginame
GO
这 returns 我正是我在本地计算机上想要的:
很好,ServerName
也有,DatabaseName
也有,NumberOfConnections
也有,等等...
但是如果我想 运行 它到远程服务器怎么办?事实上,在我的实验室中,我有一个名为 [TESLABSQL02T]
的远程服务器,让我们看看我是否可以 query it remotely:
SELECT @@ServerName AS [ServerName]
,NAME AS DatabaseName
,COUNT(STATUS) AS [NumberOfConnections]
,GETDATE() AS [TimeStamp]
,hostname
,program_name
,loginame
FROM [TESLABSQL02T].master.sys.databases sd
LEFT JOIN [TESLABSQL02T].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
太棒了:现在我想监控我的所有网络!
这是事情变得棘手的时候: 我想在每 10 分钟 运行s 并且可以查询大约 30 台服务器的作业中自动执行此操作。
让我们先尝试使用 2 个服务器 [TESLABSQL01T]
和 [TESLABSQL02T]
:
DECLARE @myTableVariable TABLE (id INT, ServerName varchar(50))
insert into @myTableVariable values(1,'[TESLABSQL01T]'),(2,'[TESLABSQL02T]')
select * from @myTableVariable
SELECT @@ServerName AS [ServerName]
,NAME AS DatabaseName
,COUNT(STATUS) AS [NumberOfConnections]
,GETDATE() AS [TimeStamp]
,hostname
,program_name
,loginame
FROM (select ServerName from @myTableVariable).master.sys.databases sd
LEFT JOIN (select ServerName from @myTableVariable).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
不幸的是没有快乐:(
查询在 FROM
和 LEFT JOIN
附近给了我一个 Incorrect syntax
。
如何每 10 分钟在每个远程服务器上向 运行 查询一次?
我应该使用列表、数组、临时 table、普通 table 吗?
我听说 FETCH NEXT FROM ObjectCursor
,可以选择吗?
动态查询?
...每个建议都是有效的。谢谢。
要解决语法错误,您必须使用游标创建动态查询:
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
但对于此查询,您必须确保您在所有服务器中都拥有权限,或者您在主体 SQL 服务器引擎
中拥有链接服务器