我正在尝试设置一个查询,它将获取我拥有的每个SQL Server的Windows版本并将其放入表中。我有查询抓取版本,但我认为有一个更好的方法来获取所需的信息,而不是逐个连接到每个单独的服务器来运行查询。我不反对使用XP_cmdshell我只是想知道是否有办法运行一个查询,将获取我在sql服务器上的每个Windows操作系统的版本。我还有一个要使用的服务器列表。
编辑:我知道我必须以某种方式触摸每台服务器。我想要一种方法来解决每个服务器的RDP并打开SQL服务器并查询它或者不得不连接到sql server中的每个服务器并逐个运行查询。我现在拥有的所有代码都是一个简单的INSERT声明我到这里,我在下一步甚至锄头上画了一个空白来解决这个问题。下表有两列ServerName和Win_Ver ServerName已经填充了我拥有的所有服务器。
INSERT INTO mtTable
(Win_Ver)
SELECT @@Version
答案 0 :(得分:1)
鉴于:
一个选项是使用游标遍历该服务器表,并为每个服务器执行xp_cmdshell
以调用SQLCMD
来运行查询。您将使用表变量从xp_cmdshell
返回的SQLCMD中捕获结果集。类似的东西:
DECLARE @ServerName sysname,
@Command NVARCHAR(4000),
@CommandTemplate NVARCHAR(4000);
DECLARE @Results TABLE ([ResultID] INT IDENTITY(1, 1) NOT NULL, [Result] NVARCHAR(4000));
SET @CommandTemplate = N'SQLCMD -S {{SERVER_NAME}} -E -h-1 -Q "PRINT @@VERSION;"';
DECLARE srvrs CURSOR LOCAL READ_ONLY FAST_FORWARD
FOR SELECT [ServerName]
FROM ServerStats;
OPEN srvrs;
FETCH NEXT
FROM srvrs
INTO @ServerName;
WHILE (@@FETCH_STATUS = 0)
BEGIN
SET @Command = REPLACE(@CommandTemplate, N'{{SERVER_NAME}}', @ServerName);
INSERT INTO @Results ([Result])
EXEC xp_cmdshell @Command;
-- Get results via SELECT [Result] FROM @Results ORDER BY [ResultID];
-- Do something with the data in @Results
DELETE FROM @Results;
FETCH NEXT
FROM srvrs
INTO @ServerName;
END;
CLOSE srvrs;
DEALLOCATE srvrs;
在那里投掷TRY / CATCH并不会受到伤害: - )。
即使不是最理想的解决方案,它至少也不需要添加112个链接服务器,并且是动态的,并且将适应添加和删除的服务器。
答案 1 :(得分:0)
在SQL Server中,您可以创建可以从其他服务器查询的链接服务器。
在您希望编写查询的服务器上:
打开对象资源管理器
转到服务器对象
右键单击链接服务器并添加新链接服务器
添加联网服务器的名称,选择SQL server并确保定义安全角色。