Sql-Server

查詢每個數據庫中的對象列表

  • April 23, 2021

我有一個分佈在多個數據庫中的大約 300 個視圖的列表。

視圖的 DDL 中使用的一些表已被刪除或重命名。

我想要做的是嘗試查詢每個數據庫中的所有 300 個視圖。

如果查詢成功,我想輸出“查詢成功”。如果由於視圖 DDL 所基於的對象失敗而導致查詢失敗,我想輸出“查詢失敗”。

最終輸出看起來像這樣

database_name     schema_name     view_name     status
db_1              dbo             view_1        Query Successful
db_2              abc             view_2        Query Failed

我知道部分解決方案將使用sp_MSforeachdb儲存過程,但我不確定在那之後該怎麼做。

我有一個儲存在表中的所有要查詢的對象的列表

您可以使用以下程式碼列出針對所有數據庫的所有視圖。它將填充#Result 中的所有內容。之後,您可以使用您的列表進行連接並檢查您想要的任何狀態。

IF OBJECT_ID('tempdb..#Result') IS NOT NULL  DROP TABLE #Result;
CREATE TABLE #Result
([Database] VARCHAR(100), [schema_name] VARCHAR(100), [view_name] VARCHAR(100))

DECLARE @DB SYSNAME,@cmd NVARCHAR(4000)

SET NOCOUNT ON
SET @cmd = ''

SELECT TOP 1 @DB = D.name
FROM master..sysdatabases AS D
WHERE dbid > 4
   and DATABASEPROPERTYEX(D.name, 'status') = 'ONLINE'
ORDER BY D.name;

WHILE @@ROWCOUNT = 1
BEGIN
     SET @cmd = 'USE ' + @DB + ';
           INSERT INTO #Result
           SELECT  DISTINCT ''' + @DB + ''' AS CustomerNumber ,sh.name, o.name AS ObjectName
           FROM sys.objects o 
           INNER JOIN sys.schemas sh on o.schema_id=sh.schema_id
           WHERE o.type = ''V''

   ';
     EXEC (@cmd)

     SELECT TOP 1 @DB = NAME
     FROM master..sysdatabases AS D
       WHERE dbid > 4
       AND DATABASEPROPERTYEX(D.name, 'status') = 'ONLINE'
           AND D.NAME > @DB
     ORDER BY D.name
END

SELECT * FROM #Result R

使用 Microsoft Excel,執行以下操作:

用單詞創建 1 列Select Count(*) from。在最右邊的一列(使其成為最後一列)中,使用該CONCATENATE函式連接第 1 列和每行的視圖名稱

最終結果將如下所示

A                             B             C
SELECT COUNT(*) FROM          view_1        =concatenate(A1, B1, ';')
                                           GO
SELECT COUNT(*) FROM          view_2        =concatenate(A3, B3, ';')
                                           GO

然後將所有內容複製並粘貼column C到 SSMS 中。

問題解決了,我很了不起,我知道。

編輯#1

使用 count(*) 很昂貴,​​將其切換為select top 1.

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