Sql-Server
刷新數據庫列表
是否可以像在 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,但如果您的目標是使用鍵盤刷新列表,您可以使用它:
- 按 F8 啟動對象資源管理器,然後按 F5(在這種情況下,它將作為刷新,如果您在對象資源管理器中,則不作為執行查詢)。
- 您可以創建自己的未分配給任何其他操作的快捷方式,轉到菜單工具 > 選項…導航到環境 > 鍵盤 > 鍵盤並蒐索 View.Refresh 或 View.ObjectExplorer。