我正在尝试创建一个指向最新版本的表的视图。例如,如果有两个表,tblZipCode2014和tblZipCode2013,我希望视图返回tblZipCode2014中的所有内容。然后,如果创建了一个名为tblZipCode2015的新表,则视图将返回tblZipCode2015中的所有内容。这样,用户可以始终使用视图来获取当前的邮政编码信息。
以下代码应该获取最新的表名,但我无法弄清楚如何使视图动态引用此表。
SELECT name FROM ( SELECT name,ROW_NUMBER() OVER(ORDER BY name desc) AS RowNum FROM Geospatial.sys.tables WHERE name like 'tblZipCode____') AS x WHERE RowNum = 1
关于如何做到这一点的任何想法?
答案 0 :(得分:2)
为什么要在多个表中存储类似的数据?
您应该有一个表tblZipCode
,其中包含一年的列。然后你可以这样做:
create view v_tblZipCode
select *
from tblZipCode
where year = (select max(year) from tblZipcode);
(子查询实际上使用索引很快。)
但是,说实话,您可以通过在定期计划的作业中定义视图或同义词来解决您的特定问题。此作业将使用动态SQL获取最新的表,然后为用户定义视图。
我认为这样的事情会起作用:
declare @sql nvarchar(max);
select top 1 @sql = 'create view myview as select * from sys.' + table_name
from information_schema.tables t
where table_name like 'tblZipCode____' and schema_name = 'sys'
order by table_name desc;
exec(@sql);
将它放在定期安排的工作中,最新的表格将被使用。
答案 1 :(得分:2)
在视图中无法做到这一点。除非使用动态sql并且不能在视图中使用动态SQL,否则不能在select语句中使表名动态化,因为您不能使用exec命令。
您可以尝试这样的事情:
答案 2 :(得分:0)
使用union all语句创建视图,如下所示:
CREATE VIEW dbo.vwZipCode
AS
SELECT zip_year, state_code, zip_code, area_code, county_FIPS, county_name, preferred, zip_code_type
FROM (
SELECT 2010 AS zip_year, state_code, zip_code, area_code, county_FIPS, county_name, preferred, zip_code_type
FROM dbo.tblZipCode2010
UNION ALL
SELECT 2011 AS zip_year, state_code, zip_code, area_code, county_FIPS, county_name, preferred, zip_code_type
FROM dbo.tblZipCode2010
UNION ALL
SELECT 2012 AS zip_year, state_code, zip_code, area_code, county_FIPS, county_name, preferred, zip_code_type
FROM dbo.tblZipCode2010
UNION ALL
SELECT 2013 AS zip_year, state_code, zip_code, area_code, county_FIPS, county_name, preferred, zip_code_type
FROM dbo.tblZipCode2010
...
) x
WHERE zip_year = YEAR(GETDATE())
按照您的喜好提前进行。
话虽这么说,另一个答案中提到的同义词解决方案是你更好的选择。