2014-09-04 2 views
0

Я пытаюсь создать представление, которое будет указывать на самую последнюю версию таблицы. Например, если есть две таблицы: tblZipCode2014 и tblZipCode2013, я бы хотел, чтобы представление возвращало все в tblZipCode2014. Затем, если создана новая таблица с именем tblZipCode2015, представление вернет все в tblZipCode2015. Таким образом, пользователь может всегда использовать представление для получения текущей информации о Zip-кодах.Создание представления, которое ссылается на самую последнюю версию таблицы?

Следующий код должен содержать самое последнее имя таблицы, но я не могу понять, как получить представление для динамической ссылки на эту таблицу.

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. Сохраненная процедура кажется мне единственным вариантом для вас здесь. –

ответ

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

+0

У меня есть несколько таблиц с подобной информацией, потому что я не уверен, что новые версии таблицы будут иметь дополнительные столбцы, и я хочу, чтобы это произошло.Я думаю, что ваш ответ будет работать отлично, но я не обрабатываю запланированные задания, и я не хочу слишком много работать для других. Вероятно, я собираюсь добавить код в пакетный файл, который импортирует таблицы ZipCode в sql, чтобы изменить представление, чтобы он ссылался на текущую таблицу ZipCode. Спасибо за ответ! – Kyle

2

Это невозможно сделать в виде. Вы не можете сделать динамическое имя таблицы динамическим в инструкции select, если вы не используете динамический sql, и вы не можете использовать динамический SQL в представлении, потому что вы не можете использовать команду exec.

Вы могли бы попробовать что-то вроде этого, вместо:

  • Создать таблицу с именем tblZipCodeCurrent (создать синоним или представление, чтобы изменить имя на что-то пользователи предпочли бы)
  • Когда вы добавляете новую таблицу, изменить название старого, чтобы год и добавить новую, как tblZipCodeCurrent
0

Создание представления с помощью объединения все заявления так:

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

Выполните это как можно раньше, как вам нравится.

Это, как говорится, решение синонима, упомянутое в другом ответе, является вашим лучшим выбором.

Смежные вопросы