Frage von okarin, 29

SQL alle zeilenanzahlen der tabellen auf einer Instanz auslesen?

Hallo,

ich wollte mir grade eine SQL-Abfrage schreiben die alle Tabellen auf einer Instanz ausliest. Als erstes hatte ich an sowas gedacht:

CREATE TABLE #rowcount ([dbname] NVARCHAR(256) NOT NULL, [tablename] NVARCHAR(256) NOT NULL, [rows] INT NOT NULL);
EXEC sp_MSforeachdb @command1='USE[?]; EXEC sp_MSforeachtable @command1=''INSERT INTO #rowcount SELECT DB_Name(), ''?'', COUNT(*) FROM ?'''
SELECT * FROM #rowcount ORDER BY rows DESC
DROP TABLE #rowcount

Leider funktioniert das nicht da die ? von sp_MSforeachtable nicht aufgelöst werden sonder stattdessen sp_MSforeachdb diese auflöst. Dann hab ich mir gedacht nagut nehm ich statt sp_MSforeachdb halt einen Cursor soviele Datenbanken gibts ja normalerweise nicht auf einer Instanz.

CREATE TABLE #rowcount ([dbname] NVARCHAR(256) NOT NULL, [tablename] NVARCHAR(256) NOT NULL, [rows] INT NOT NULL);

DECLARE database_cursor CURSOR FOR SELECT name FROM sys.databases;
DECLARE @database NVARCHAR(256);

OPEN database_cursor;
FETCH NEXT FROM database_cursor INTO @database;

WHILE @@FETCH_STATUS = 0
BEGIN
    EXEC('USE ' + @database + '; EXEC sp_MSforeachtable @command1=''INSERT INTO #rowcount SELECT DB_Name(),''?'', COUNT(*) FROM ?;''');
    FETCH NEXT FROM database_cursor INTO @database;
END

SELECT * FROM #rowcount ORDER BY rows DESC;

CLOSE database_cursor;
DEALLOCATE database_cursor;
DROP TABLE #rowcount;

Dort werden aber wieder nicht die ? von sp_MSforeachtable aufgelöst was ich ehrlichgesagt überhaupt nicht verstehe. Hat denn irgendwer ne Lösung dafür?

Vielen dank für alle Antworten.

Antwort
von RBM1992, 4

Was bei der 2. Methode nicht stimmt, kann ich leider nicht feststellen. Aber vielleicht ist das hier das, was du suchst:


CREATE TABLE #x(db SYSNAME, o SYSNAME, rc SYSNAME);

DECLARE @sql NVARCHAR(MAX) = N'';

SELECT @sql += 'INSERT #x(db,o,rc)
SELECT db = N''' + name + '''
,o.name [Name]
,ddps.row_count [Row Count]
FROM ' + QUOTENAME(name) + '.sys.indexes AS i
INNER JOIN ' + QUOTENAME(name) + '.sys.objects AS o
ON i.OBJECT_ID = o.OBJECT_ID
INNER JOIN ' + QUOTENAME(name) + '.sys.dm_db_partition_stats AS ddps
ON i.OBJECT_ID = ddps.OBJECT_ID AND i.index_id = ddps.index_id
WHERE i.index_id < 2 AND o.is_ms_shipped = 0
ORDER BY o.NAME;'
FROM sys.databases
WHERE database_id > 4;

EXEC sp_executesql @sql;

SELECT db, o, rc FROM #x ORDER BY db, o;


Durch etwas Google-Arbeit fand ich dieses Script hier:
http://stackoverflow.com/questions/15668590/tsql-rowcounts-of-all-tables-in-a-se...

Diese (englischsprachige) Seite, stackoverflow, ist immer ein guter Ansatz bei Fragen rund um die Programmierung. Hoffentlich konnte ich weiterhelfen.

Keine passende Antwort gefunden?

Fragen Sie die Community