我可以在视图中重命名表名吗?我有一个视图,我需要每月自动更新表名称。例如;
SELECT *
FROM Feb_Data
改成
SELECT *
FROM Mar_Data
我通过动态SQL尝试了不同的方法,它不起作用,我需要一个视图,因为数据太大。我试过SP_RENAME
(这只适用于列或视图名称)。
或者其他人可以想出更好的自动化方法吗?
一种方法是编写一个带有动态ALTER VIEW
语句的存储过程,该语句根据所需的月份名称设置表名。然后设置一个作业,在该月的第一个午夜运行该程序。
沿着这些方向的东西(几乎只是伪代码):
CREATE PROCEDURE dbo.AlterViewWithMonthlyTableNames
AS
BEGIN
DECLARE @TableName SYSNAME = CONCAT(CAST(GETDATE() AS NCHAR(3)),'_Data')
,@SQL NVARCHAR(1000);
SET @SQL = CONCAT
(
'ALTER VIEW dbo.YourView
AS
SELECT *
FROM ', QUOTENAME(@TableName),';'
);
EXEC sp_executesql @SQL;
END
那么最好的解决方案是将您的数据库重组为一个表而不是每月的表(可能使用视图模仿旧的每月表结构),但如果这不是一个选项...
没有动态SQL的一个选项是选择UNION中的所有表并按当前日期过滤
SELECT *
FROM Jan_Data
WHERE MONTH(GETDATE()) = 1
UNION ALL
SELECT *
FROM Feb_Data
WHERE MONTH(GETDATE()) = 2
...
(我对性能没有任何承诺;这纯粹是为了便于维护,但优化器可能会考虑任何性能问题)
作为旁注,年底会发生什么? Jan_Data会被取代吗?仅按月(而非按年)分开表似乎是非常有限的。