I am using sp_MSforeachtable to get a rowcount of specific tables in my database. I want these ordered by name.
How do I add an ORDER BY clause to sp_MSforeachtable?
I am using sp_MSforeachtable to get a rowcount of specific tables in my database. I want these ordered by name.
How do I add an ORDER BY clause to sp_MSforeachtable?
On
Either of these should do it;
EXEC sp_MSforeachtable @command1 = "SELECT count(*) as '?' FROM ? ", @whereand = 'ORDER BY 1'
EXEC sp_MSForEachTable 'SELECT ''?'', COUNT(*) FROM ?', @whereand = 'ORDER BY 1'
Kudos to Chris_R for the "@whereand = 'ORDER BY 1'" - I would upvote but do not have the rep to do so.
On
You don't :-)
Just use this SQL script instead - much easier to use and much more configurable - you can sort as you wish!
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
On
One way is to create a temp table, then insert / execute in to it. Then do a select / order by on the temp table.
On
This will return correct counts, where methods using the meta data tables will only return estimates.
create this procedure (slightly different than from 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
I understand this question is over 10 years old, but it has over 3000 visits and a bunch of wrong answers. I'm going to repurpose Chris R.'s answer in hopes of getting this marked as the accepted answer, instead of overly-complicated half-pages of SQL or "you can't" answers. I came here with the exact same question so it's still relevant and obviously not simple.
Use the
@whereandparameter to specify anORDER BYclause, The contents of that parameter are tacked on to the end of the internalSELECTstatement via a simple+ @whereandin the stored proc. And using1inORDER BY 1means to order by the first column.