2014-09-04 52 views
0

我想創建一個視圖,指向最新版本的表格。例如,如果有兩個表,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

如何做到這一點任何想法?

+4

您將需要動態SQL,並且視圖的定義中只能包含簡單的單個select語句。存儲過程在我看來是你在這裏唯一的選擇。 – 2014-09-04 14:33:35

回答

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); 

只是把這個在定期安排的工作,最近的表就會習慣。

+0

+1「爲什麼你要在多個表中存儲相似的數據?」 – gvee 2014-09-04 14:43:51

+0

我有多個具有類似信息的表格,因爲我不確定表格的較新版本是否會有其他列,我想允許這種情況發生。我認爲你的回答可以很好地工作,但我不處理預定的工作,我不想爲別人造成太多的工作。我可能最終會將一些代碼添加到批處理文件中,該文件將ZipCode表導入sql以更改視圖,以便引用當前的ZipCode表。感謝你的回答! – Kyle 2014-09-04 16:00:02

2

這在視圖中是不可能的。除非使用動態SQL,並且不能在視圖中使用動態SQL,否則不能在select語句中使表名稱動態化,因爲您不能使用exec命令。

你可以嘗試這樣的,而不是什麼:

  • 創建一個名爲tblZipCodeCurrent表(創建一個同義詞或視圖名稱更改爲用戶寧願)
  • 當你添加新表,改變舊的名稱有一年,並添加新的tblZipCodeCurrent
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()) 

儘可能提前執行,只要你喜歡。

這就是說,在另一個答案中提到的同義詞解決方案是您更好的選擇。