Sql-Server

刷新數據庫列表

  • May 23, 2021

是否可以像在 SSMS 右上下文菜單刷新選項中一樣在 T-SQL 中執行數據庫列表刷新?

我有一個 2014 Express 實例,裡面有 197 個數據庫。在我的 C# 應用程序中,我有一個用於獲取所有數據庫名稱的方法。有時它只返回 34 個結果,並在下一次呼叫中返回 197。

我正在使用以下腳本來獲取數據庫名稱:

SELECT name, create_date
FROM sys.databases 
WHERE name NOT IN ('master','model','msdb','tempdb')
AND name NOT LIKE 'ReportServer$%'
AND HAS_DBACCESS(name) = 1

OPEN db_cursor  
FETCH NEXT FROM db_cursor INTO @db_name, @create_date

WHILE @@FETCH_STATUS = 0  
BEGIN  

   EXEC(' USE [' + @db_name + '];
           INSERT INTO #temp_App
               SELECT ''' +  @db_name + ''',
               ''' + @create_date + '''
               FROM sys.extended_properties
               WHERE name = ''Application''
               AND value = ''app01''
           ')

   FETCH NEXT FROM db_cursor INTO @db_name, @create_date     
END 

CLOSE db_cursor
DEALLOCATE db_cursor

SELECT * FROM #temp_App
DROP TABLE #temp_App

以及執行腳本的c#程式碼

List<DatabaseInfo> list = new List<DatabaseInfo>();
           
           using (SqlConnection connection = new SqlConnection(connectionString))
           {
               try
               {
                   connection.Open();
                   using (SqlCommand command = connection.CreateCommand())
                   {
                       
                       command.CommandText = query;
                    
                       using (SqlDataReader resultReader = command.ExecuteReader())
                       {
                           while (resultReader.Read())
                           {
                               string name = resultReader[0].ToString();
                               DateTime createDateTime = DateTime.Parse(resultReader[1].ToString());

                               list.Add(new DatabaseInfo(name, createDateTime));
                           }
                       }
                   }
                   connection.Close();
               }
               catch (Exception myException)
               {
                   log.Error("Error occured  " + myException.Message);
               }
               finally
               {
                   connection.Close();
               }
           }
           return list;
       }

正如其他人所提到的,對於 SSMS 中對象資源管理器中的對象,刷新****上下文菜單只是為了更新SSMS的 UI 。

聽起來您正在嘗試獲取數據庫名稱的恆定列表。如果沒有看到你的 C# 程式碼,我們就無法告訴你為什麼你會得到不同數量的名字。

您可以使用sys.databases系統視圖來獲取最新的數據庫列表(包括它們的名稱)。這將始終包括所有數據庫。

如果您只想要線上(因此可用)數據庫,那麼類似以下的查詢將為您提供該列表(儘管該列表可能會根據您讓數據庫離線或更改狀態等的頻率而變化更大):

SELECT name 
FROM sys.databases 
WHERE state_desc = 'ONLINE'; -- can also use WHERE state = 0

我知道您要求使用 T-SQL,但如果您的目標是使用鍵盤刷新列表,您可以使用它:

  1. 按 F8 啟動對象資源管理器,然後按 F5(在這種情況下,它將作為刷新,如果您在對象資源管理器中,則不作為執行查詢)。
  2. 您可以創建自己的未分配給任何其他操作的快捷方式,轉到菜單工具 > 選項…導航到環境 > 鍵盤 > 鍵盤並蒐索 View.Refresh 或 View.ObjectExplorer。

在此處輸入圖像描述

引用自:https://dba.stackexchange.com/questions/292024