2013-04-23 202 views
0

我有一个SSMS实例打开,我连接到一个远程服务器以及本地主机。我如何获取SSMS当前连接的所有服务器的名称?远程服务器的会徽图案形似 enter image description here获取多个服务器名称SSMS连接到

和当地的模样 enter image description here

另外,我想知道是否有任何问题与连接到多台服务器从SSMS的一个实例,以及如何通过脚本在服务器之间切换,而无需点击表名并执行类似的操作select top 1000 rows

回答

1

好的这里有很多问题,因为这并不总是一个简单的答案。根据您的环境和权限,您可能拥有一个或多个允许访问一个或多个具有一个或多个服务器的环境的权限组,因此可以访问一个或多个数据库。但是,如果您拥有权限并且已将链接的服务器设置为数据访问,则可以执行此类操作以获取您有权访问的内容的列表。你可以在不同的环境中类似地运行它,使它成为一个你可以用ADO.NET或类似的方法调用的过程。

--declare variable for dynamic SQL 
DECLARE 
    @SQL NVARCHAR(512) 
, @x  int 


-- Create temp table to catch linked servers 
Declare @Servers TABLE 
    (
     Id   int identity 
    , ServerName VARCHAR(128) 
    ) 

-- insert linked servers 
insert into @Servers 
select name 
FROM sys.servers 

-- remove temp table if it exists as it should not be prepopulated. 
IF object_ID('tempdb..#Databases') IS NOT NULL 
    DROP TABLE tempdb..#Databases 
; 

-- Create temp table to catch built in sql stored procedure 
CREATE TABLE #Databases --DECLARE @Procs table 
    (
     ServerName  varchar(64) 
    , DatabaseName VARCHAR(128) 
    ) 

SET @X = 1 

-- Loops through the linked servers with matching criteria to examine how MANY there are. Do a while loop while they exist. 
WHILE @X <= (SELECT count(*) FROM @Servers) 
BEGIN 
    declare @DB varchar(128); 

    Select @DB = ServerName from @Servers where Id = @X -- get DB name from current cursor increment 

    -- Set up dynamic SQL but do not include master and other meta databases as no one cares about them. 
    SET @SQL = 'insert into #Databases select ''' + @Db + ''', name from ' + @DB + '.master.sys.databases 
       where name not in (''master'',''tempdb'',''model'',''msdb'')' 

    -- Execute the dynamic sql to insert into collection object 
    exec sp_executesql @SQL 

    -- increment for next iteration on next server 
    SET @X = @X + 1 
END 
; 

SELECT * 
FROM #Databases 
+0

这是一个广泛的,深思熟虑的答案。 +1 – wootscootinboogie 2013-04-23 19:26:04

+0

很高兴它可以帮助你。 – djangojazz 2013-04-23 19:34:13

1

我不完全确定你在问什么。如果您问是否可以在单个查询窗口中连接到多个SQL Server实例,则答案为肯定。我详细讨论了这里的含义以及其中的一些含义:Multiple instances, single query window

如果另一方面您询问如何告诉您连接的实例,可以使用@@SERVERNAME

SELECT @@SERVERNAME 

它会返回您连接到的实例的名称。

通常你需要连接到一个实例每次查询窗口和窗口之间翻转影响特定实例你感兴趣的内容。

如果你想要写一个命令派你去,你可以设置一个特定实例将查询窗口设置为SQLCMD模式(查询菜单 - > SQLCMD模式)并使用:CONNECT命令。

:CONNECT InstaneName 
SELECT @@SERVERNAME 
+0

说例如我有两个连接,一个本地和一个远程。可用数据库的下拉列表(靠近SSMS中的“新建查询”按钮)将只显示可用于特定实例的数据库。如果我转到另一个实例并展开数据库文件夹,然后右键单击并选择“top top 1000 rows”,则连接会自动更改。这是怎么通过脚本? – wootscootinboogie 2013-04-23 18:43:55

+0

你正在看两件不同的事情。左边的部分是对象浏览器,右边是查询窗口。您在对象资源管理器中有连接,并在查询窗口中有连接。当您右键单击并选择“选择最多1000行”时,您将在右侧创建新的连接。连接没有改变。你正在打开一个新的。 – 2013-04-23 19:40:22