2017-11-25 1 views
0

Wir wollen auf der SQL Server-Instanz Ebene Gesamtzahl der einzelnen Objekttypen erhalten (einschließlich aller Datenbanken).SQL Server - Count jeweils Objekte auf Instanzebene

z.

Stored Procedures 
Views 
Tables 
Constraints 
Jobs 
Linked Servers 
Replication 

Dieser Code gibt die Anzahl auf Datenbankebene zurück; Wie ändere ich diesen Code, um die Zählerstände unter instance anzuzeigen?

WITH objs AS 
(
    SELECT 
     type_desc AS Object_Type, 
     COUNT(*) AS Object_Count, 1 AS JoinColumn 
    FROM 
     sys.objects 
    --exclude internal tables, service queues, and system tables 
    WHERE 
     TYPE NOT IN ('IT', 'S', 'SQ') 
    GROUP BY 
     type_desc 
), 
tots AS 
(
    SELECT COUNT(*) AS Type_Count, 1 AS JoinColumn 
    FROM sys.objects 
    WHERE TYPE NOT IN ('IT', 'S', 'SQ') 
) 
SELECT 
    Object_Type, Object_Count, Type_Count, 
    CAST((Object_Count * 1.0)/Type_Count * 100 AS INT) AS Type_Pct 
FROM objs o 
JOIN tots s ON o.JoinColumn = s.JoinColumn 
ORDER BY Object_Type; 

Grüße

+0

Sie müssen dynamisches SQL verwenden und über alle Datenbanken auf dem Server iterieren. Möchten Sie Systemdatenbanken einbeziehen? –

Antwort

0

Hier ist und beispielsweise die dynamische SQL und einen Cursor alle Benutzer-Datenbanken auf dem Server iterieren verwendet.

SET NOCOUNT ON; 
DECLARE @DatabaseCounts TABLE(
     Object_Type nvarchar(60) 
    , Object_Count INT 
    ); 

DECLARE 
     @DatabaseName sysname 
    , @SQL nvarchar(MAX); 

DECLARE Databases CURSOR LOCAL FAST_FORWARD FOR 
    SELECT name 
    FROM sys.databases 
    WHERE 
     name NOT IN(N'master',N'model',N'tempdb',N'msdb',N'SSISDB',N'distribution'); 

OPEN Databases; 
WHILE 1 = 1 
BEGIN 
    FETCH NEXT FROM Databases INTO @DatabaseName; 
    IF @@FETCH_STATUS = -1 BREAK; 
    SET @SQL = N' 
USE ' + QUOTENAME(@DatabaseName) + N'; 
    SELECT 
      type_desc AS Object_Type 
     , COUNT(*) AS Object_Count 
    FROM sys.objects 
    --exclude internal tables, service queues, and system tables 
    WHERE TYPE NOT IN (''IT'', ''S'', ''SQ'') 
    GROUP BY type_desc 
'; 
    INSERT INTO @DatabaseCounts 
     EXEC sp_executesql @SQL; 
END; 
CLOSE Databases; 
DEALLOCATE Databases; 

WITH 
    instance_counts1 AS (
     SELECT 
       Object_Type 
      , SUM(Object_Count) AS Object_Count 
     FROM @DatabaseCounts 
     GROUP BY Object_Type 
    ) 
    , instance_counts2 AS (
     SELECT 
       Object_Type 
      , Object_Count 
      , (SELECT SUM(Object_Count) FROM instance_counts1) AS Type_Count 
     FROM instance_counts1 
    ) 
SELECT 
     Object_Type 
    , Object_Count 
    , Type_Count 
    , CAST(ROUND(Object_Count * 100.0/Type_Count, 0) AS INT) AS Type_Pct 
FROM instance_counts2;