Sql-Server
是否可以僅針對中央託管伺服器的一部分執行查詢?
例如,我想執行這個查詢來獲取一些設置了高可用性組的伺服器的狀態:
SELECT s.role_desc, g.name, r.replica_server_name , GETDATE() as checkTime FROM sys.dm_hadr_availability_replica_states AS s INNER JOIN sys.availability_replicas AS r ON s.replica_id = r.replica_id INNER JOIN sys.availability_groups g ON r.group_id = g.group_id
…但是某些託管伺服器是 SQL Server 2008,它們在查詢中沒有這些視圖,因此查詢返回錯誤。
我試過類似的東西:
SELECT s.role_desc, g.name, r.replica_server_name , GETDATE() as checkTime FROM sys.dm_hadr_availability_replica_states AS s INNER JOIN sys.availability_replicas AS r ON s.replica_id = r.replica_id INNER JOIN sys.availability_groups g ON r.group_id = g.group_id where r.replica_server_name in (select server_name FROM msdb.dbo.sysmanagement_shared_registered_servers_internal where server_name like 'theserversIwant%a' )
…但它不起作用。它仍然查詢所有託管伺服器的整個列表。
嘗試將您的查詢包裝在一些檢查
@@version
. 它仍會訪問中央託管伺服器列表中的所有伺服器,但不會引發錯誤。這是您可以嘗試的範例。IF (SELECT @@VERSION) LIKE '%2008%' BEGIN SELECT 'not avail on 2008' AS role_desc ,'not avail on 2008' AS NAME ,'not avail on 2008' AS replica_server_name ,GETDATE() AS checkTime END ELSE BEGIN SELECT s.role_desc ,g.NAME ,r.replica_server_name ,GETDATE() AS checkTime FROM sys.dm_hadr_availability_replica_states AS s INNER JOIN sys.availability_replicas AS r ON s.replica_id = r.replica_id INNER JOIN sys.availability_groups g ON r.group_id = g.group_id END
關於您關於保存 CMS 查詢結果的問題 - 我不知道這樣做的內置方法。但是,一種選擇(需要一些額外的工作)是:
- 執行 CMS 查詢,選擇所有結果網格並選擇 Copy with Headers。
- 前往DBFiddle並點擊頁面底部的 Text To DDL 按鈕。
- 將 CMS 網格結果的內容粘貼到“格式化文本”視窗中,並在“表名”框中輸入表名。
- 點擊 Preview DDL 按鈕,它將顯示一個
CREATE TABLE
命令和INSERT
語句。您必須對生成的 DDL 進行一些小的修改,例如刪除列名周圍的刻度線引號,並在具有空格的列名周圍使用括號,
[Server Name]
或在保留標識符周圍放置括號,如[Name].
這將允許您將結果保存到您選擇的表格中以供進一步分析。
我喜歡斯科特的回答。但是,如果您是否要針對特定伺服器執行查詢的標準不是可以通過查詢內部的條件邏輯輕鬆處理的東西怎麼辦?這是另一種方法:
您可以在中央託管伺服器列表中創建伺服器組。
右鍵點擊註冊伺服器視窗的中央管理伺服器部分中的 CMS 伺服器的名稱,然後選擇
New Server Group...
。給它一個名字,比如“Not2008”,以及一個可選的描述。然後將現有的註冊伺服器移動到該組,或者將一個或多個新的註冊伺服器條目添加到該組。現在您可以右鍵點擊該組並使用New Query
它打開一個查詢視窗,您可以使用該視窗僅針對該組的成員執行查詢。