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

高手再帮帮忙 ,存储过程的问题
要创建一个用来查询的存储过程,数据库里有二十四张表,表名都是以月份命名的tabyyyymm(如tab200703),选择日期查询时可以是查询某一个月的,也可以跨月份的查询,比如查询2007年2月份至6月份的数据,已经有高手指点了,


但还有个问题
就是想在存储过程里添加个变量,接受其他条件查询,表里有name   和id两个字段。根据name   去查id。这样写不对    
create   table   tab200701(id   int,name   char(10))
insert   into   tab200701   select   1,aa
create   table   tab200702(id   int,name   char(10))
insert   into   tab200702   select   2,bb
create   table   tab200703(id   int,name   char(10))
insert   into   tab200703   select   3,cc
create   table   tab200704(id   int,name   char(10))
insert   into   tab200704   select   4,dd
go


create   proc   usp_test  
      @begin   varchar(06),
      @end   varchar(06)= ' ',
      @name   varchar(50)
AS
if   @end= ' '
  set   @end=@begin
declare   @sql   varchar(8000)
set   @sql= ' '
select   @sql=@sql+@name+ '   union   all   select   *   from   [ '+name+ '] '   from   sysobjects  
  where   right(name,6)   > =   @begin  
          and     right(name,6) <=@end
          and   name   like   'tab% '
          and   len(name)=9
          and   xtype= 'u '  
set   @sql=   stuff(@sql,1,11, ' ')
exec(@sql)
print   @sql
GO
exec   usp_test   '200701 ', '200702 ', 'where   name= 'vicky ' '


------解决方案--------------------
create proc usp_test
@begin varchar(06),
@end varchar(06)= ' ',
@name varchar(50)
AS
if @end= ' '
set @end=@begin
declare @sql varchar(8000)
set @sql= ' '
select @sql=@sql+ ' union all select * from [ '+name+ '] ' from sysobjects
where right(name,6) > = @begin
and right(name,6) <=@end
and name like 'tab% '
and len(name)=9
and xtype= 'u '
set @sql= stuff(@sql,1,11, ' ') + @name
exec(@sql)
print @sql
GO
exec usp_test '200701 ', '200702 ', 'where name= ' 'vicky ' ' '
------解决方案--------------------
如果想where对每个表生效就要加到每个表的后面
select @sql=@sql+ ' union all select * from [ '+name+ '] '+@name from sysobjects