如题。像是下面的SQL代码,是写在存储过程中调用的,还是在函数中写的啊。我想写好在C#程序中调用,怎么调用呢。变量分别是开始时间和结束时间。--根据查询的列创建一个临时表
create table table_111201(id int)
insert into table_111201 select 1
gocreate table table_111202(id int)
insert into table_111201 select 2
gocreate table #temp(id int)    -- 具体的字段declare @start datetime
declare @end datetime
declare @sql varchar(8000)
set @start = '2011-12-01'
set @end = '2011-12-02'select @sql = isnull(@sql+' union all ','')+'select * from table_'+date
from(
    select right(convert(varchar(8),dateadd(dd,number,@start),112),6) date
    from master..spt_values
    where [type] = 'p' and number between 0 and datediff(dd,@start,@end)
)tinsert into #temp exec(@sql)select * from #temp
--select 其他查询,根据#temp临时表drop table #temp,table_111201,table_111202/***************id
-----------
1
2(2 行受影响)

解决方案 »

  1.   


    create proc get_temp
    @start datetime,
    @end datetime
    as
    begin
    declare @sql varchar(8000)select @sql = isnull(@sql+' union all ','')+'select * from table_'+date
    from(
      select right(convert(varchar(8),dateadd(dd,number,@start),112),6) date
      from master..spt_values
      where [type] = 'p' and number between 0 and datediff(dd,@start,@end)
    )texec(@sql)
    end
    不过这样子还是有很大的漏洞,比如某个日期对应的表不存在,可能还需要加上表是否存在的判断等。
      

  2.   

     谢谢,还有一个小问题,就是说这个变量吧还有一个小区,查询一个小区这段时间所有产生的数据。而且这个小区的数据并不是说每一天都产生,可能有天有或者有天没有,怎么控制呢。下面这段代码是根据小区可以查询,但是一旦有天没有数据,这个视图就产生不起来了。另外,有一个基本表datainfo,包括所有小区【cellname】的基本信息。难倒要把基本表和每天的流水账表对应起来视图吗declare @dt1 datetime,@dt2 datetime
    declare @cellname varchar(10)
    declare @sql nvarchar(max)
    --设置起止日期
    set @dt1='2012-02-01'
    set @dt2='2012-02-07'
    --设置小区名
    set @cellname='Acell'
    --形成动态查询语句
    select @sql=isnull(@sql+' union all ','')
        +'select * from Table_'
        +right(convert(varchar(8),dateadd(d,number,@dt1),112),6)
        +' where cellname='''+@cellname+''''
    from master..spt_values
    where type='p' and dateadd(d,number,@dt1)<=@dt2
    --执行动态查询语句
    exec(@sql)
    /*
    如果将上面这句改成 select @sql,则你会得到这样的字串(复制网格中的内容):
    select * from Table_120201 where cellname='Acell' union all select * from Table_120202 where cellname='Acell' union all select * from Table_120203 where cellname='Acell' union all select * from Table_120204 where cellname='Acell' union all select * from Table_120205 where cellname='Acell' union all select * from Table_120206 where cellname='Acell' union all select * from Table_120207 where cellname='Acell'
     
      

  3.   

    那么这样子可能需要在sys.objects中判断表是否存在,简单如下。
    declare @dt1 datetime,@dt2 datetime
    declare @cellname varchar(10)
    declare @sql nvarchar(max)
    --设置起止日期
    set @dt1='2012-02-01'
    set @dt2='2012-02-07'
    --设置小区名
    set @cellname='Acell'--生成该时间段类似表名
    ;with cte as
    (
    select 'Table_'+right(convert(varchar(8),dateadd(d,number,@dt1),112),6) as [name]
    from master..spt_values
    where type='p' and dateadd(d,number,@dt1)<=@dt2
    )
    --形成动态查询语句
    select @sql=isnull(@sql+' union all ','')
      +'select * from '
      +[name]
      +' where cellname='''+@cellname+''''
    from sys.objects
    where type='U' and [name] in (select [name] from cte)
    --执行动态查询语句
    exec(@sql)
      

  4.   

    首先是判断表的存在,然后判断cellname在这个表中有没有数据,我刚才在查询分析器中验证。
    系统提示:在关键字 'with' 附近有语法错误。
      
      

  5.   

    貌似是2000,忘了。试试这样子
    declare @dt1 datetime,@dt2 datetime
    declare @cellname varchar(10)
    declare @sql nvarchar(max)
    --设置起止日期
    set @dt1='2012-02-01'
    set @dt2='2012-02-07'
    --设置小区名
    set @cellname='Acell'--形成动态查询语句
    select @sql=isnull(@sql+' union all ','')
      +'select * from '
      +[name]
      +' where cellname='''+@cellname+''''
    from sys.objects
    where type='U' 
        and [name] in (select [name] from (
             select 'Table_'+right(convert(varchar(8),dateadd(d,number,@dt1),112),6) as [name]
             from master..spt_values
             where type='p' and dateadd(d,number,@dt1)<=@dt2)t)
    --执行动态查询语句
    exec(@sql)
      

  6.   


    谢谢你,把那个【sys.objects】改成【sysobjects】就可以了。问题解决了。