一个存储过程的有关问题,请帮忙!

一个存储过程的问题,请帮忙!急!!!!!
在存储过程里:
create   proc   proc_test
@tabName   varchar(100)
as
declare   @rowCounts   int
select   @rowCounts   =   count(*)   from   @tabName
print   @rowCounts

exec   proc_test   'users '

执行时会报错,说必须声明变量@tabName
如果我将count(*)   from   @tabName   改为   count(*)   from   users   则可以通过
请问这是为什么呢?如何解决这个问题。
急需解决,谢谢!!!!!!!

------解决方案--------------------
--try

create proc proc_test
@tabName varchar(100)
as
exec( '
declare @rowCounts int
select @rowCounts = count(*) from '+@tabName+ '
print @rowCounts
')
------解决方案--------------------
--or

create proc proc_test
@tabName varchar(100)
as
declare @rowCounts int, @sql nvarchar(4000)
set @sql= 'select @rowCounts = count(*) from '+@tabName
exec sp_executesql @sql, N '@rowCounts int output ', @rowCounts output
print @rowCounts
------解决方案--------------------
select子句中的from后面的词语必须是表名,并且不能是变量;
执行动态语句查询时,必须使用exec或者sp_executeSql存储过程。
exec( 'select * from '+@tabname)
set @RowCounts = @@Rowcount
------解决方案--------------------
用select赋值时,from后的表名如果是变量就会出这问题。
一般采用以字符串的形式用exec来执行躲避此问题.
------解决方案--------------------
create proc proc_test
@tabName varchar(100)
as
declare @s
set @s= 'select count(*) from '@tabName
exec (@s)