日期:2014-05-18  浏览次数:20699 次

如何在使用存储过程选择表
是这样的
假设我的数据库有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