I’d like to generate a table that consists of list of all available tables and number of rows for each of them.
Table Name | Number of rows |
---|---|
SCHEMA.TABLE_NAME1 | 30 |
SCHEMA.TABLE_NAME2 | 40 |
I’ve used the query below:
select schema_name(tab.schema_id) + '.' + tab.name as [table],
sum(part.rows) as [rows]
from sys.tables as tab
inner join sys.partitions as part
on tab.object_id = part.object_id
where part.index_id IN (1, 0) -- 0 - table without PK, 1 table with PK
group by schema_name(tab.schema_id) + '.' + tab.name
order by sum(part.rows) desc
but unfortunately, the number of rows for all tables with more than 1000 rows is 1000 for some reason.
Is there any other way to do that?
3
Answers
The query that you are using is also giving incorrect results for me. For some reason, the rows column in
sys.partitions
has its value as 1000 when the table is created (even though the tables are empty).As an alternative, I tried using the following query. I created a temporary table called
#rows_for_tables
which will be used to store our result.Then I have used while loop, where we loop through table names collected in a temporary table
req_tables
, to calculate the number of rows for each table available insys.tables
.We get a table_name, insert it in
rows_for_tables
, update the no_of_rows field with count of table_name for that particular table and delete that table_name from#req_tables
(Since its is inserted and we don’t need it).Once the above procedure is executed, the required results will be present in
#rows_for_tables
temporary table.Total Query:
Output:
Here is the code that will do it for you:
I had the same desire, but in Synapse SQL i get the following error with above solutions:
So i built a 3-step solution:
Solution: