如何通过名称动态调用视图内的表

时间:2015-09-02 21:51:06

标签: sql sql-server-2008 tsql

我需要在数据库中的一系列表上编写一个sql视图。问题是该表只包含一个月的历史记录。每个月都会创建一个新表。例如,dbo.LOG_2015_09将是9月份的表格。

我需要写一个视图,向我展示过去60天的历史。

SELECT * FROM dbo.LOG_2015_09
UNION ALL
SELECT * FROM dbo.LOG_2015_08

问题是下个月这将不再有效。

我仅限于使用SQL视图。存储过程不是一种选择。

我有一个想法是创建一个表函数来获取相关表,但我认为我们不能使用动态SQL来生成代码。

感谢您的帮助。

编辑:这是应用程序创建的表定义的示例。我没有任何修改表的权限。我只能创建视图或功能。:

CREATE TABLE [dbo].[CLOG201509](
   [LASTUPD] [datetime] NULL,
   [CREDATE] [datetime] NULL,
   [SERIALNO] [int] NOT NULL,
   [LSEQNO] [int] NOT NULL,
   [EVENTNO] [int] NOT NULL,
   [EVDATE] [datetime] NOT NULL,
   [LOGDATE] [datetime] NOT NULL,
 CONSTRAINT [PK__CLOG2015__D08461DA672EF3E9] PRIMARY KEY CLUSTERED 
 ([SERIALNO] ASC,
  [EVENTNO] ASC,
  [LSEQNO] ASC
 ) WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

这些表每个包含超过一百万条记录。

编辑:我试图创建一个TABLE UDF来组合表但不能使用动态SQL我不知道如何根据日期更改表。我希望将这个月表与上个月表联合起来参考。问题是我必须记住每个月都更新这个UDF,直到我这样做,数据不可用。

CREATE FUNCTION [dbo].[KS_ManitouSync_OPT_CLOG]()
RETURNS TABLE 
AS
RETURN 
(
    SELECT * 
    FROM CLOG201511
    UNION ALL 
    SELECT *
    FROM CLOG201512
)

提醒我不能使用存储过程,它必须只能由支持单个SQL SELECT查询的程序使用。

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

您可以创建一个分区视图来对所有表进行联合,但每个表必须有一个约束来限制其中允许的时间间隔。在这种情况下,当您从分区视图中选择时,在分区列上使用WHERE子句,只会访问相关表。

请参阅https://technet.microsoft.com/en-us/library/ms190019(v=sql.105).aspx

答案 1 :(得分:1)

通过存储过程创建视图。在那里你可以找出所有存在的日志表,然后构建你的create view命令。

看一下我过去的一个非常相似的问题:

Creating View with dynamic columns by stored procedure