如何在使用存储过程选择表
是这样的 
 假设我的数据库有1mon,2mon,3mon一直到12mon   一共12张用户资料表,代表每个月客户的状态,每张表的字段都是相同的,其中有个字段为   serv_state   ,如果serv_state   的值为   F1R   则表示拆机,比如,我要得到1月客户的拆机数 
 那么,我建立了一个存储过程: 
 CREATE   PROCEDURE   chaiji       
 as          
 select   acc_nbr,serv_name,serv_state          
 from   1mon 
 where          
 serv_state= 'F1R ' 
 ---------------------------- 
 但如果我要得到,其他月份的拆机,我岂不是要重复的修改所需要查询的表名,然后再执行,有没有什么办法,使用存储过程运行之后可选择表名,然后,即可出现该月拆机的结果?   
 好傻的问题,见笑了 
------解决方案--------------------這樣呢?   
 DECLARE @TABLENAME NVARCHAR(100)   
 SET @TABLENAME =  '1mon '     
 EXEC( 'select acc_nbr,serv_name,serv_state     
 from [ ' + @TABLENAME +  '] where serv_state= ' 'F1R ' ' ')
------解决方案--------------------存储过程里传入个月份参数 
 CREATE PROCEDURE chaiji   
 @mth int 
 as   
 if @mth > 12 or @mth  <1 return 
 declare @s varchar(300) 
 set @s= 'select acc_nbr,serv_name,serv_state    
 from  ' +cast(@mth as varchar)+ 'mon where serv_state= ' 'F1R ' ' ' 
------解决方案--------------------ncufunk(大叔) ( ) 信誉:100    Blog  2007-03-31 13:09:51  得分: 0         
    楼上的,该存储过程语法似乎没问题 
 但不需要执行 exec chaiji 么? 
 直接 exec(@s)? 
 如果 exec chaiji ,则mth 没有提供参数啊 
 如果exec(@s)也会 出现『必须声明变量  '@s '。』的出错提示。。        
 ------------   
 是他沒寫完整,分開寫了。   
 CREATE PROCEDURE chaiji   
 @mth int 
 as   
 if @mth > 12 or @mth  <1 return 
 declare @s varchar(300) 
 set @s= 'select acc_nbr,serv_name,serv_state    
 from  ' +cast(@mth as varchar)+ 'mon where serv_state= ' 'F1R ' ' ' 
 exec(@S) 
 GO   
 --然後你調用存儲過程的時候,就這麼用   
 Exec chaiji 1