2016-06-02 6 views
0

Ich habe eine Datenbank test benannt, hat 2 Ansichten und 2 Tabellen in Schema dbo wie folgt aus: example databaseListe Zeilenanzahl jeder Ansicht und Tabelle

Ich möchte eine Tabelle erstellen report benannt, die die Zeilennummern aufgelistet von jede Ansicht und jeder Tisch. Das Konzept ist so:

enter image description here

Allerdings habe ich keine Ahnung, wie zu implementieren:

select table_name, table_type, "select count(*) from table_name" as rowCount 
into test.dbo.report 
from test.INFORMATION_SCHEMA.tables; 

Die test.dbo.report sollte wie folgt aussehen. Dynamic SQL ist wahrscheinlich der Weg zu gehen, aber etwas verwirrend.

Ich bin mit SQL Server 2014

+0

Welches Ergebnis erwarten Sie? – Bharadwaj

Antwort

3

Sie dynamische SQL verwenden können, eine riesige Kette von union all select Aussagen zu bauen:

declare @sql nvarchar(max) = '' 

-- use an undocumented(?) trick with string concatenation in a select statement 
select @sql = @sql + 'union all select ' + 
    '''' + TABLE_NAME + ''' as TABLE_NAME, ' + 
    '''' + TABLE_TYPE + ''' as TABLE_TYPE, ' + 
    '(select count(*) from ' + TABLE_NAME + ') as [COUNT]' + 
    char(13) + char(10) 
from INFORMATION_SCHEMA.TABLES 

-- remove leading "union all" 
set @sql = right(@sql, len(@sql)-len('union all ')) 

--print @sql -- to check what's going to be executed 

exec sp_executesql @sql 

Die SQL baut und führt aussieht:

select 'customers' as TABLE_NAME, 'BASE TABLE' as TABLE_TYPE, (select count(*) from customers) as [rowcount] 
union all select 'items' as TABLE_NAME, 'BASE TABLE' as TABLE_TYPE, (select count(*) from items) as [rowcount] 
union all select 'orders' as TABLE_NAME, 'VIEW' as TABLE_TYPE, (select count(*) from orders) as [rowcount] 
union all ... 

Leider können Sie dynamisches SQL nicht als eine Spalte in einer SELECT-Anweisung ausführen - es gibt nichts, was Ihnen erlauben würde, so einfach zu tun wie:

select table_name, table_type, exec('select count(*) from ' + table_name) as [count] 
into test.dbo.report --   /\== doesn't work 
from test.INFORMATION_SCHEMA.tables; 
1

Run unter Abfrage

DECLARE  @SQL VARCHAR(MAX); 
    SET   @SQL = ''; 

    SELECT @SQL = @SQL + 'INSERT INTO test.dbo.report SELECT ''' + 
       TABLE_SCHEMA + '.' + table_name + ''', ''' + table_type + ''', COUNT(*) FROM ' + 
       TABLE_SCHEMA + '.' + table_name + 
       CHAR(13) from INFORMATION_SCHEMA.tables 

    EXEC (@SQL) 
+0

Ungültiger Objektname 'test.dbo.report'. – realtemper

+0

Sie haben die Tabelle "report" in der Testdatenbank gemäß Ihrer Frage erstellt. Update "test.dbo.report" zu Ihrem Datenbanknamen .schemaname.table name " –

+0

Gearbeitet, mit' create table test.dbo.report ( table_name varchar (50), table_type varchar (50), rowCnt int ); 'vorangestellt. – realtemper

3

Da sind Sie speziell SQL Server verwenden, müssen Sie nicht künstlich selbst Schema zur Verwendung von Informationen beschränken. Die Informationen, die Sie benötigen, befinden sich in den dynamischen Verwaltungsansichten. Oder, eine Ansicht speziell:

select object_name(object_id), sum(rows) 
from sys.partitions 
where index_id in (0, 1) 
group by object_id; 

Die Zeilenanzahl ist ungefähre, aber es ist normalerweise ziemlich nah in meiner Erfahrung. Sie haben den Vorteil, dass Sie nicht alle Daten einer Tabelle scannen müssen, um eine Zählung zu erhalten. Hinweis: Dies funktioniert nicht für Ansichten, es sei denn, die Ansicht ist eine indizierte Sicht.

Verwandte Themen