MS SQL SERVER 2000视图问题:如何创建表名是动态确定的视图?

MSSQLSERVER2000目前遇到这样一个情况:可能是由于顾虑单表数据太多影响处理性能,而将表按照月份进行区别。如:ABC201011ABC201012ABC2011... MS SQL SERVER 2000 目前遇到这样一个情况:
可能是由于顾虑单表数据太多影响处理性能,而将表按照月份进行区别。如:
ABC201011
ABC201012
ABC201101
ABC201102
......
ABC201112
其实,ABC中存储的都是商品销售情况。
现在要建立一个视图,而且必须是视图,不能是存储过程,要求视图反映上日商品销售情况。
最直观的想法是取出昨日日期,通过昨日日期确定昨日日期所属年月,然后根据商品销售表的命名规则ABC+YYYYMM,确定取数的表,最终从这张表中取数。
可MS SQL SERVER的视图只能调用数据库函数,而函数又不能执行动态SQL。
这让人如何是好?

哪位高手能帮忙解决一下这个问题?
注意,要求最终出产必须是视图,不能是存储过程。

在此先谢谢了!
上面说的不太明白,我再解释一下:
商品销售数据被保存在一组表中,这些表的命名规则是: “ABCYYYYMM”(ABC加上年月)。如:
ABC201011 // 该表存储2010年11月份的商品销售数据
ABC201012 // 该表存储2010年12月份的商品销售数据
ABC201101 // 该表存储2011年1月份的商品销售数据
ABC201102 // 该表存储2011年2月份的商品销售数据
......
ABC201112 // 该表存储2011年12月份的商品销售数据
现在要建立一个视图,必须是一个视图,不能是存储过程,而且要求视图反映当前日期上一日的商品销售情况,比如说2011年12月11日查询视图,视图反映2011年12月10日的商品销售情况;2012年1月2日查询视图,反映2012年1月1日的商品销售情况。
展开
 我来答
dongfanghong_1
2011-12-22 · TA获得超过363个赞
知道小有建树答主
回答量:272
采纳率:0%
帮助的人:308万
展开全部
看了各位高手的回答,思路是对的。那我来总结下你的问题:
问题、所有的数据表结构完全一样,每月一张,要联合起来形成一张视图。动态生成视图。
难处,就是这个生成的动作如何触发?那么这里就要把用存储过程和数据库作业结合起来用了。
存储过程用于动态生成视图;而数据库作业就是触发的动作,什么时候做的问题。
2个步骤解决你的疑问。第一,建存储过程;第二,建数据库作业。那么如果设置调度时间呢,我们假设就是每个月的月初,来生成上个月的数据表,此时完成之后,即可调度生成视图,这个表大概什么时候生成,你总应该知道吧,过程如下:

create proc CreateViewMonth

as

declare @sql varchar(8000)
set @sql=''
select @sql=@sql+'select * from '+[name]+' union all ' from sysobjects where type='U' and [name] like '%ABC%'

if len(@sql)>0
begin
set @sql='create view view_Month_Data as '+left(@sql,len(@sql)-9)

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[View_Month_Data]') and OBJECTPROPERTY(id, N'IsView') = 1)
drop view [dbo].[View_Month_Data]

end

exec(@sql)

然后,根据你的数据表大概生成的时间。来确定数据库作业的时间。 若有疑问,可以发消息过来
追问
谢谢!
try4148
2011-12-16 · TA获得超过334个赞
知道小有建树答主
回答量:632
采纳率:100%
帮助的人:393万
展开全部
你先把所有表都union all,然后直接从这里面查询不就行了
例如:
select * from
(
ABC201012
union all
...
select * from ABC201101
union all
select * from ABC201102
) t where t.日期=dateadd(d,-1,getdate())
更多追问追答
追问
关键是每到一个新的月份,会自动创建一张表。
比如到了2012年1月,就会创建ABC201201这张表。
追答
恩,需要在创建表的时候同时更新视图。
关键创建表操作是手工,还是程序,还是通过调用存储过程?
在那边改一下就好了。。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
king7788520
2011-12-21 · TA获得超过262个赞
知道小有建树答主
回答量:120
采纳率:0%
帮助的人:152万
展开全部
给你写了个过程 不知道你还在不在了

CREATE PROCEDURE create_view
AS
DECLARE @view_name CHAR(10)
DECLARE @sql varchar(200)
BEGIN
--拼写视图名
SELECT @view_name = 'ABC' + replace(convert(char(7),getdate() - 1,120),'-','')
--IF:如果不存在’ABC+年月‘这个视图,就创建,否则修改它
IF NOT EXISTS(
SELECT 1
FROM sys.views
WHERE NAME = @view_name)
--创建视图
SET @sql = 'CREATE VIEW ' + @view_name
+ 'AS SELECT * FROM TEST_1 '
+ 'WHERE convert(char(10),DATEtime1,120) = convert(char(10),getdate(),120)'
ELSE
--修改视图
SET @sql = 'ALTER VIEW ' + @view_name
+ 'AS SELECT * FROM TEST_1 '
+ 'WHERE convert(char(10),DATEtime1,120) = convert(char(10),getdate(),120)'
EXEC(@sql)
END

在2005下测试通过了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
18970843425
2011-12-16
知道答主
回答量:3
采纳率:0%
帮助的人:4978
展开全部
用视图向导,在设计器里面进行条件设置。或者用SQL语句建立程序
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百彭世松度
2011-12-15
知道答主
回答量:4
采纳率:0%
帮助的人:6629
展开全部
太复杂了,看不懂
追问
我已在问题补充中解释了一下,还劳烦再帮满想想办法。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
牧之卉0j1
2011-12-15 · TA获得超过1151个赞
知道大有可为答主
回答量:1689
采纳率:0%
帮助的人:1746万
展开全部
汗,你就不能在select 后加个条件啊
或者你写个作业,定期更新这个视图
你这需求单靠视图实现不了
追问
这是数据接口需求。是要向上级单位报送数据,上级单位已提供相应取数程序,上级单位取数程序没办法修改,它的程序非常简单就是从视图中取数。
换句话说,与上级单位程序必须以提供一个视图作为数据接口数据提供方实现。
至于这个视图和这组表的关系,就随便写了。
还望再给想想办法。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式