本地有三个数据库D2010,D2011,D2012
三个库的库结构基本一样,只是其中存放的数据因年份不同而不同。
程序操作画面可以给查询操作限定时间,比方指定的时间是2011,SQL语句如何写?这种形式的数据库在读写时应该注意些什么?

解决方案 »

  1.   

    如果确定分库规则,则在代码中判断并指定需要访问的库。比如是2010年的数据,则访问D2010;如果不确定,那就写个存储过程,如果数据不在D2012,则查找D2011......当然也可以用比较笨拙的union all。
      

  2.   


    1、如果3个库权限结构一致。
    LZ可以考虑用动态拼接字符串的方式处理declare @i varchar(4)
    declare @sql nvarchar(2000)set @sql ='select * from '+'D'+@i+'.dbo.tablename'
    exec (@sql)2、用存储过程调用。写好判断即可。同样要注意权限设定。if @i = '2010'
    select * from D2010.dbo.tablenameif @i = '2011'
    select * from D2011.dbo.tablename
      

  3.   

    设置3个库的相应操作权限,具体操作的时候只要在正常的表和存储过程前面加上----数据库名.DBO.表名
    就可以了。同实例下的数据库,指定数据库名字只要权限分配了,可以不用切换数据库,直接操作即可。
      

  4.   

    lz:你的问题我也遇到过,不就是数据库的多个备份吗的查询问题吗方案1:1楼说的笨方法:用union all   
    这种方案的缺点是每个数据库都要查询,占用时间多一点方案2:你给出需查询时间,用这个时间去判断在哪个数据库中,也就是得到那个数据库名,然后再查询数据。
    占用时间要看数据量的大小,如果数据量大的话时间和第一种方案错不了多少的。当然了这种办法是比较好的办法。你的数据表中有没有日期字段,如果有可以先建立一个总表。数据库名   表名   数据日期
    db1       tb      2008
    db1       tb      2009
    db2       tb      2010
    db2       tb      2011
    db3       tb      2012这个可以根据你的表数据来建立就行了。下面再根据传进来的值去取数据不就行了吗,也很好取的。
    再想省事的话,你的那个总表也可以是一个视图,以后就可以随便用了。希望楼主成功。