获取SSMS连接的多个服务器的名称

时间:2013-04-23 18:27:01

标签: sql-server tsql sql-server-2008-r2

我有一个SSMS实例打开,我连接到一个远程服务器以及localhost。如何获取SSMS当前连接的所有服务器的名称?远程服务器的标志看起来像 enter image description here

和当地人一样 enter image description here

另外,我想知道从一个SSMS实例连接到多个服务器是否有任何问题,以及如何通过脚本在服务器之间切换而不点击表名并执行select top 1000 rows < / p>

2 个答案:

答案 0 :(得分:1)

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

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

SELECT @@SERVERNAME

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

通常,您将连接到每个查询窗口的一个实例,并在窗口之间切换以影响您感兴趣的特定实例。

如果要编写命令将您发送到特定实例,可以将查询窗口设置为SQLCMD模式(查询菜单 - > SQLCMD模式)并使用:CONNECT命令。 / p>

:CONNECT InstaneName
SELECT @@SERVERNAME

答案 1 :(得分: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