在线等,求一存储过程,谢谢各位!!

free1879 2007-10-16 11:19:54
求一个存储过程
两个实例,一个当前实例,数据库中存有当前一年的数据记录table2007
另一个实例存储其它年份数据库的实例,按年分,如table_2005年一个表,table_2006一个表
分别存储两年的数据
现在有求一个存储过程
传入2个参数是DATATIME型的,查出两个时间段之间的数据!可能是跨年的,也可能是不跨年的,可能是当前年的,也可能是去年的,前年的!
看看各位怎么写,谢谢了!
...全文
82 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
Limpire 2007-10-17
  • 打赏
  • 举报
回复
我是说分区视图,不是普通视图。

如果是仅仅是数据检索,除了UNION ALL之外没别的办法。

如果是数据汇总,根据传入DATATIME型的参数,用动态SQL,将逐个表的汇总结果,先放到临时表,最后对临时表再来一次汇总。这样处理,应该比先将所有数据UNION ALL起来,再一次性汇总要快。
free1879 2007-10-17
  • 打赏
  • 举报
回复
400多行了,调了头大!还没有搞出来!!期待高手啊,我想过取余!!
free1879 2007-10-17
  • 打赏
  • 举报
回复
不能 数据量大!慢的要死,我试过了 查的范围大要五分多钟,不满足要求!
只能用动态SQL语句!
Limpire 2007-10-17
  • 打赏
  • 举报
回复
--能不能建分区视图

create view all_data
as

.......
select * from table_2005
union all
select * from table_2007
........

go

select * from all_data where 时间 between 时间1 and 时间2
jingxijun 2007-10-17
  • 打赏
  • 举报
回复
学习
free1879 2007-10-17
  • 打赏
  • 举报
回复
我知道的,分区视图不能动态更新,我要向前兼容,只能用动态SQL了
shilifeng 2007-10-17
  • 打赏
  • 举报
回复
create query(begin datatime,end datatime)
as

select * from
(
select * from table_2005
union all
select * from table_2007
) a
where a.时间 between begin and end
free1879 2007-10-17
  • 打赏
  • 举报
回复
之后就是按小楼兄的方法来整了,谢谢大家!!!
free1879 2007-10-17
  • 打赏
  • 举报
回复
又想了一天,最关键的已经写好了,共享一下,再次谢过大家。
alter  procedure proc1(@var1 datetime, @var2 datetime)
--@var2是最近时间
as
declare @sqltmp varchar(1000)
declare @len int --时间差(年)
declare @bztime datetime--标志存储当前的数据库截断时间
set @bztime = ( select sj from backlsyygs.dbo.xszdsj);
--@len存储时间差
set @len = cast(year(@var2) as int)- cast(year(@var1) as int);

if (@len=0 and @var1 > @bztime)--大于标志位,不垮年,不跨当前数据库,从当前数据库取
set @sqltmp = 'select * from lsyygs.dbo.xsdetail where sj>= '+''''+convert(varchar(10),@var1,126)+''''+' and sj<=' + ''''+convert(varchar(10),@var2,126)+'''';

if (@len=0 and @var2<= @bztime)--小于标志位,不跨年,不涉及当前数据库,从以前年份备份数据库取数
begin
set @sqltmp = 'select * from backlsyygs.dbo.xsdetail'+''+cast(year(@var1) as varchar(4)) +''+' where sj>= '+''''+convert(varchar(10),@var1,126)+''''+' and sj<=' + '''';
set @sqltmp = @sqltmp+convert(varchar(10),@var2,126)+'''';
end

if(@len =0 and cast(year(getdate()) as int)=cast(year(@var1) as int) and @var1<=@bztime and @var2>@bztime)
--介于标志时间之间,必须跨越当前数据库和历史数据库,从两表中取数据
begin
set @sqltmp = 'select * from backlsyygs.dbo.xsdetail' + ''+cast(year(@var1) as varchar(4)) +'' +' where sj>='+''''+convert(varchar(10),@var1,126) + ''''+' and sj<=' +'''';
set @sqltmp = @sqltmp +convert(varchar(10),@bztime,126)+'''';
set @sqltmp = @sqltmp + ' union all select * from lsyygs.dbo.xsdetail where sj>='+''''+convert(varchar(10),@bztime,126)+''''+' and sj<=' + ''''+convert(varchar(10),@var2,126)+'''';
end

if(@len<>0 and @var2>@bztime)--跨年,跨当前表
begin
set @sqltmp ='select * from lsyygs.dbo.xsdetail where sj>='+''''+convert(varchar(10),@bztime,126)+''''+' and sj<=' + ''''+convert(varchar(10),@var2,126)+'''';
declare @i int--计数器,计有多少个表
set @i=cast(year(@var2) as int )
while (@i>cast(year(@var1) as int ))
begin
set @sqltmp = @sqltmp + 'union all select * from backlsyyggs.dbo.xsdetail'+''+cast(@i as varchar(4)) +'';
set @i = @i-1
while (@i=cast(year(@var1) as int))
begin
set @sqltmp = @sqltmp + 'uinon all select * from backlsyygs.dbo.xsdetail where sj>='+''''+convert(varchar(10),@var1,126) + '''';
end
end
end

if (@len <> 0 and @var2 <=@bztime)--跨年,不跨当前表
begin
set @sqltmp = 'select * from backlsyygs.dbo.xsdetail' +'' + cast(year(@var2) as varchar(4)) + ''+' where sj<= ' +'''' + convert(varchar(10),@var2,126) + '''';
set @i=cast(year(@var2) as int )-1--减一是因为已经查了一个表
while (@i>cast(year(@var1) as int ))
begin
set @sqltmp = @sqltmp + 'union all select * from backlsyyggs.dbo.xsdetail'+''+cast(@i as varchar(4)) +'';
set @i=@i-1
end
while (@i=cast(year(@var1) as int))--最后一个表要加结束时间
set @sqltmp = @sqltmp + 'uinon all select * from backlsyygs.dbo.xsdetail where sj>='+''''+convert(varchar(10),@var1,126) + '''';
end

exec(@sqltmp)
free1879 2007-10-16
  • 打赏
  • 举报
回复
就是这样了,如果我贴出来了,大家都是这样了,看看你们写的!!
GEPIN 2007-10-16
  • 打赏
  • 举报
回复
思路首先要求出两个日期之间的年差,然后通过动态SQL组合查询语句,是要用到UNION ALL的(只要你的表的结构是一样)
楼主按思路自己尝试写一下,期待别人为你写,不如自己写了,自己收获。调试不通过再发上来让大家帮你看看。
free1879 2007-10-16
  • 打赏
  • 举报
回复
我写的调试不通过!用到了UINION ALL
free1879 2007-10-16
  • 打赏
  • 举报
回复
谁写好了 重新开贴 给100分!!!

22,207

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧