2013-04-23 66 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