This is my third iteration on this idea. Produces 1 result set, documents the DB and table so this could be used on several DBs to produce a joined list:
declare @DB_nme sysname
set @DB_nme = ' pubs '
set NOCOUNT ON
declare @sql nvarchar(900)
if (CHARINDEX('[',@DB_nme, 0) = 0) set @DB_nme = '[' + rtrim(ltrim(@DB_nme)) + ']'
set @sql = 'use ' + @DB_nme + '
set NOCOUNT ON
declare @sql nvarchar(500)
create table #TablCnt (DBName sysname, TableName sysname, NumRows int)
declare @crs cursor
set @crs = cursor FAST_FORWARD FOR
select ''insert into #TablCnt (DBName, TableName, NumRows)
select ''''' + @DB_nme + ''''',''''['' + table_name + '']'''',count(*) from '+ @DB_nme
+ '.dbo.['' + table_name + '']'' from INFORMATION_SCHEMA.TABLES
open @crs
FETCH NEXT FROM @crs
INTO @sql
WHILE @@FETCH_STATUS = 0
BEGIN
exec (@sql)
FETCH NEXT FROM @crs
INTO @sql
END
close @crs
deallocate @crs
select * from #TablCnt
'
exec sp_executesql @sql