2009-08-24 15 views
1

Ich verwende sp_MSforeachtable, um eine Reihe von bestimmten Tabellen in meiner Datenbank zu erhalten. Ich möchte diese namentlich bestellen.sp_MSforeachtable Auftrag von

Wie füge ich eine ORDER BY Klausel zu sp_MSforeachtable hinzu?

Antwort

2

von diesem Link: http://sqlserver2000.databases.aspfaq.com/how-do-i-get-a-list-of-sql-server-tables-and-their-row-counts.html

Das wird richtig zählt zurück, wo Methoden, um die Metadaten Tabellen werden nur Schätzungen zurück.

erstellen dieses Verfahren (etwas anders als von Link):

CREATE PROCEDURE dbo.listTableRowCounts 
AS 
BEGIN 
    SET NOCOUNT ON 

    CREATE TABLE #foo 
    ( 
     tablename VARCHAR(255), 
     rc INT 
    ) 

    INSERT #foo 
     EXEC sp_msForEachTable 
      'SELECT PARSENAME(''?'', 1), 
      COUNT(*) FROM ? WITH (NOLOCK)' 

    SELECT tablename, rc 
     FROM #foo 
     ORDER BY tablename 

    DROP TABLE #foo 
END 
GO 
+0

das ist ein toter Link jetzt :-( –

3

Sie dies nicht tun :-)

einfach diese SQL-Skript stattdessen verwenden - viel einfacher zu bedienen und vieles mehr konfigurierbar - Sie sortieren können, wie Sie möchten!

SELECT 
    t.NAME AS TableName, 
    i.name as indexName, 
    sum(p.rows) as RowCounts, 
    sum(a.total_pages) as TotalPages, 
    sum(a.used_pages) as UsedPages, 
    sum(a.data_pages) as DataPages, 
    (sum(a.total_pages) * 8)/1024 as TotalSpaceMB, 
    (sum(a.used_pages) * 8)/1024 as UsedSpaceMB, 
    (sum(a.data_pages) * 8)/1024 as DataSpaceMB 
FROM 
    sys.tables t 
INNER JOIN  
    sys.indexes i ON t.OBJECT_ID = i.object_id 
INNER JOIN 
    sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id 
INNER JOIN 
    sys.allocation_units a ON p.partition_id = a.container_id 
WHERE 
    t.NAME NOT LIKE 'dt%' AND 
    i.OBJECT_ID > 255 AND 
    i.index_id <= 1 
GROUP BY 
    t.NAME, i.object_id, i.index_id, i.name 
ORDER BY 
    object_name(i.object_id) 

Marc

+1

+1 für den richtigen Weg. Schade, dass Sie alle Seitenzahlen, aber keine tatsächliche Zeilenanzahl anzeigen;) 'sum (sys.partitions.rows)' –

+0

Danke, Remus! Das muss irgendwo entlang der Linien verloren gegangen sein ... –

2

Eine Möglichkeit ist, eine temporäre Tabelle zu erstellen, legen Sie/execute in ihm. Dann machen Sie eine Auswahl/Reihenfolge von auf der Temp-Tabelle.

3

EXEC sp_MSforeachtable @SQL, @whereand = 'ORDER BY 1'

+0

Bitte fügen Sie einige Kommentare zu Ihrer Antwort hinzu –

0

Beides sollte es tun;

EXEC sp_MSforeachtable @ command1 = "SELECT Anzahl (*) als '?' Her?“, @whereand = 'ORDER BY 1'

EXEC sp_MSForEachTable 'Select ''?' 'COUNT (*) FROM?', @whereand = 'ORDER BY 1'

Ansehen zu Chris_R für das "@whereand = 'ORDER BY 1'" - Ich würde upvote, aber nicht den Vertreter dazu haben.