Почему SQL Server не может изменить представление в хранимой процедуре? - PullRequest
5 голосов
/ 15 сентября 2010

Я использую MS SQL Server, и я хотел бы изменить представление из хранимой процедуры, выполнив что-то вроде «изменить представление VIEWNAME as ([some sql])».

AНа нескольких страницах, созданных Google, утверждается, что это не поддерживается напрямую (и не являются связанными операторами alter-table), но есть также примеры того, как обойти это с помощью таких конструкций:

declare @sql varchar(max)
select @sql = 'alter view VIEWNAME as ([some sql])'
exec(@sql)

Записькод в виде буквенных строк немного пахнет, даже для SQL.

Мои вопросы:

  1. Почему это не поддерживается?Какая разница между выполнением этого из sproc и выполнением его как отдельного оператора?
  2. Почему обходной путь через exec работает с литеральной строкой SQL?Насколько я понимаю, оператор exec состоит в том, что он просто выполняет встроенный SQL, это неправильно?
  3. (не оптимистично). Есть ли лучший способ внести изменения в представление из хранимой процедуры??

1 Ответ

2 голосов
/ 16 сентября 2010

Я думаю, что ответы таковы:

  1. MS хочет запретить запуск DDL изнутри процедур.
  2. Код в инструкция exec не обрабатываетсякак часть процедуры, поэтому на нее не распространяются те же ограничения, что и на процедуру.
  3. Нет.

Альтернативным подходом может быть создание отдельной таблицы (называемой чем-то вродеswing_table) с 1 или 0 записями, чтобы указать, должен ли представление запрашивать производственную или другую (резервную?) таблицу соответственно - что-то вроде:

create view viewname as
select {field list}
from production_table
cross join swing_table
union all
select {field list}
from backup_table
where (select count(*) from swing_table) = 0

- затем TRUNCATE swing_table внутри процедуры, когда вы хотите,ну, качайте таблицу - поскольку TRUNCATE не является транзакционной командой, она должна выполняться немедленно.

...