2014-07-08 14 views
7

Wie können wir alle Tabellen in der Datenbank ohne Daten (wie in, es gibt keine Zeilen in der Tabelle) im Falle eines Microsoft SQL Server abrufen?
Gibt es eine Methode?Tabellen ohne Daten finden

+0

http://blog.sqlauthority.com/2010/09/08/sql-server-find-row-count-in-table-find-largest-table-in-database-part-2/ – sumit

Antwort

1

Try this -

WITH CTE AS 
(
SELECT sc.name +'.'+ ta.name TableName 
     ,SUM(pa.rows) RowCnt 
FROM  sys.tables ta 
     INNER JOIN sys.partitions pa 
        ON pa.OBJECT_ID = ta.OBJECT_ID 
     INNER JOIN sys.schemas sc 
        ON ta.schema_id = sc.schema_id 
WHERE ta.is_ms_shipped = 0 AND pa.index_id IN (1,0) 
GROUP BY sc.name,ta.name 
) 

SELECT * FROM CTE WHERE RowCnt = 0 
+1

http: // blog.sqlauthority.com/2010/09/08/sql-server-find-row-count-in-table-find-largest-table-in-database-part-2/ – sumit

0

Wie in AdaTheDev's answer erklärte:

Eine Aussage denke ich, ist erwähnenswert ist SET FMTONLY:

SET FMTONLY ON; 
SELECT * FROM SomeTable 
SET FMTONLY OFF; 

keine Zeilen verarbeitet oder gesendet an den Client wegen der Anfrage, wenn SET FMTONLY ist tu eingeschaltet.

Der Grund dafür kann sehr nützlich sein, weil Sie jede Abfrage/gespeicherte Prozedur liefern kann und nur die Metadaten des Suchresultates zurückzukehren.

Oder, wie

Versuchen in Shoaib's answer erklärte: SELECT TOP 0 * FROM [TableName]

und SQLDataAdapter verwenden, um einen Datensatz zu füllen, erhalten dann die Tabelle aus diesem DataSet.

Fiddle Demo

2

Versuchen Sie, diese

SELECT TableName=OBJECT_NAME(OBJECT_ID) ,Data_Rows= SUM(row_count) 
    FROM  sys.dm_db_partition_stats 
    WHERE index_id in (0 ,1) 
    GROUP BY OBJECT_ID 
    HAVING SUM(row_count) = 0 

ODER Wenn u nur benutzerdefinierte müssen Tabellen dann diese verwenden

SELECT TableName=OBJECT_NAME(s.OBJECT_ID) ,Data_Rows= SUM(row_count) 
    FROM  sys.dm_db_partition_stats s 
    JOIN  sys.tables T 
    ON  T.object_id = S.object_id  
    WHERE index_id in (0 ,1) 
    and  T.type = 'U' 
    GROUP BY s.OBJECT_ID 
    HAVING SUM(row_count) = 0 
+0

System-DB wird ebenfalls angezeigt ... – Jesuraja

+0

Frage hat Systemtabellen nie ausgeschlossen. – Azar

0

Um die Liste der leeren Tische zu bekommen, können wir Verwenden Sie die folgende tsql -

EXEC sp_MSforeachtable 'IF NOT EXISTS (SELECT 1 FROM ?) PRINT ''?'' ' 

Und eine Liste von Tabellen zu erhalten zumindest eine Reihe von Daten, die wir den unten Tsql verwenden können -

EXEC sp_MSforeachtable 'IF EXISTS (SELECT 1 FROM ?) PRINT ''?'' ' 
0
SELECT '[' + SCHEMA_NAME(t.schema_id) + '].[' + t.name + ']' AS fulltable_name, SCHEMA_NAME(t.schema_id) AS schema_name, t.name AS table_name, 
i.rows 
FROM sys.tables AS t INNER JOIN 
sys.sysindexes AS i ON t.object_id = i.id AND i.indid < 2 and i.rows=0 

Es Namen und Zeilen in den Tabellen Tabelle

geben