SQL - Могу ли я переименовать имя таблицы в представлении? - PullRequest
1 голос
/ 18 марта 2019

Можно ли переименовать имя таблицы в представлении? У меня есть представление, которое мне нужно обновлять имя таблицы автоматически каждый месяц. Например;

SELECT *
FROM Feb_Data

Изменить на

SELECT *
FROM Mar_Data

Я пробовал разные способы с помощью динамического SQL, и он не работает, и мне нужно представление, потому что данные слишком велики. Я попытался SP_RENAME (это работает только на столбцы или имя представления).

Или кто-нибудь еще может придумать лучший способ автоматизировать это?

Ответы [ 2 ]

1 голос
/ 18 марта 2019

Что ж, лучшее решение состоит в том, чтобы реорганизовать вашу базу данных в одну таблицу вместо таблиц в месяц (возможно, используя представления для имитации старой структуры месячных таблиц), но если это не вариант ...

Один из вариантов без динамического SQL - выбрать все таблицы в UNION и отфильтровать их по текущей дате

SELECT *
FROM Jan_Data
WHERE MONTH(GETDATE()) = 1
UNION ALL
SELECT * 
FROM Feb_Data
WHERE MONTH(GETDATE()) = 2
...

(я не даю никаких обещаний по поводу производительности; это просто для простоты обслуживания, но оптимизатор может позаботиться о любых проблемах с производительностью)

Как примечание, что происходит в конце года? Jan_Data заменяется? Наличие отдельных таблиц только по месяцам (не по годам) может показаться весьма ограничивающим.

0 голосов
/ 18 марта 2019

Одним из способов может быть написание хранимой процедуры с динамическим оператором 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
...