在一个查询中查询多个SQL Server

时间:2015-10-02 14:48:30

标签: sql-server command-line

我正在尝试设置一个查询,它将获取我拥有的每个SQL Server的Windows版本并将其放入表中。我有查询抓取版本,但我认为有一个更好的方法来获取所需的信息,而不是逐个连接到每个单独的服务器来运行查询。我不反对使用XP_cmdshell我只是想知道是否有办法运行一个查询,将获取我在sql服务器上的每个Windows操作系统的版本。我还有一个要使用的服务器列表。

编辑:我知道我必须以某种方式触摸每台服务器。我想要一种方法来解决每个服务器的RDP并打开SQL服务器并查询它或者不得不连接到sql server中的每个服务器并逐个运行查询。

我现在拥有的所有代码都是一个简单的INSERT声明我到这里,我在下一步甚至锄头上画了一个空白来解决这个问题。下表有两列ServerName和Win_Ver ServerName已经填充了我拥有的所有服务器。

INSERT INTO mtTable
(Win_Ver)

SELECT @@Version

2 个答案:

答案 0 :(得分:1)

鉴于:

  • 大约有112台服务器"
  • 服务器是2008年至2012年和#34;之间的混合物。
  • "我们保留了所有数据库服务器统计信息的表格。"
  • 和"我们会定期要求我们生成这些统计信息"

一个选项是使用游标遍历该服务器表,并为每个服务器执行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并确保定义安全角色。